【问题标题】:AWS Cloud Formation Elastic Load Balancing Account IDAWS Cloudformation Elastic Load Balancing 账户 ID
【发布时间】:2016-11-28 04:05:44
【问题描述】:

我正在尝试使用云形成创建一个模板,该模板设置一个将日志写入 S3 存储桶的负载均衡器。我不想让每个人都拥有完全访问权限(例如 *),而是想限制 PutObject 仅访问负载均衡器帐户或服务:

{
  "Resources": {
    "LoggingBucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {
          "Ref": "LoggingBucket"
        },
        "PolicyDocument": {
          "Action": [
            "s3:PutObject"
          ],
          "Effect": "Allow",
          "Resource": {
            "Fn::Join": [
              "",
              [
                "arn:aws:s3:::",
                {
                  "Ref": "LoggingBucket"
                },
                "/*"
              ]
            ]
          },
          "Principal": {
            "Ref": "ElasticLoadBalancingAccountID" //How do I set this dynamically?
          }
        }
      }
    }
  }
}

documentation 提供各个地区 ELB 实例的账户 ID。但是,我正在创建的模板有一个可用区参数,用户可以在其中选择一个可用区来部署堆栈。所以我最理想的做法是在我的存储桶策略中使用某种ref 变量,该变量根据可用区获取负载均衡器的帐户ID。

我还查看了official documentation 中的示例,但使用Ref 的示例并没有真正定义变量。

我如何做到这一点?

编辑:我指的是可用区而不是区域。输入参数为用户提供区域中可用区域的下拉列表。

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-cloudformation


    【解决方案1】:

    我想通了。它不是真正的动态,但比直接硬编码 id 更好。根据this Amazon re-invent presentation,正确的方法是先定义一个映射:

    {
      "Mappings": {
        "RegionalConfigs": {
          "us-east-1": {
            "AMI": "",
            "ELBAccountId": "127311923021",
            "ArnPrefix": "arn:aws:"
          },
          "us-west-1": {
            "AMI": "",
            "ELBAccountId": "027434742980",
            "ArnPrefix": "arn:aws:"
          },
          "us-west-2": {
            "AMI": "",
            "ELBAccountId": "797873946194",
            "ArnPrefix": "arn:aws:"
          }
        }
      }
    }
    

    然后在策略中使用它:

    {
      "Resources": {
        "LoggingBucketPolicy": {
          "Type": "AWS::S3::BucketPolicy",
          "Properties": {
            "PolicyDocument": {
              "Version": "",
              "Resource": {
                "Fn::Join": [
                  "",
                  [
                    {
                      "Fn::FindInMap": [
                        "RegionalConfigs",
                        {
                          "Ref": "AWS::Region"
                        },
                        "ArnPrefix"
                      ]
                    },
                    "s3:::",
                    {
                      "Ref": "LoggingBucket"
                    },
                    "/",
                    "Logs",
                    "/AWSLogs/",
                    {
                      "Ref": "AWS::AccountId"
                    },
                    "/*"
                  ]
                ]
              },
              "Principal": {
                "AWS": {
                  "Fn::FindInMap": [
                    "RegionalConfigs",
                    {
                      "Ref": "AWS::Region"
                    },
                    "ELBAccountId"
                  ]
                }
              },
              "Action": [
                "s3:PutObject"
              ]
            },
            "Bucket": {
              "Ref": "LoggingBucket"
            }
          }
        }
      }
    }
    

    【讨论】:

    【解决方案2】:

    没有包含 ELB 帐户 ID 的变量。这些是 AWS 的各种账户标识符。

    要将它们包含在您的政策中,您必须:

    1. 对这些帐户 ID 进行硬编码,
    2. 在模板中为它们使用输入变量,或者
    3. 尝试使用 CloudFormation“映射”来设置区域到帐户 ID 列表的映射,然后使用 AWS::Region 变量选择适当的列表。

    【讨论】:

    • 嗨..谢谢您的回复。我的意思是可用区而不是区域。我尝试了您的建议,但出现错误:Access Denied for bucket: xxxxxxxxxxx.development. Please check S3bucket permission
    • 我创建了一个输出变量来转储 `{"Ref":"AWS::AccountId"} 的值,结果它写入了我的帐户 ID 的值..创建堆栈并且不是用于运行 ELB 的帐户 ID,如下所示:docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/…
    • 好的。我明白你想做什么。你想要的没有变量。您必须对这些帐户 ID 进行硬编码,或者在模板中为它们使用输入变量。
    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 2012-05-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多