AWS Cloud Formation Elastic Load Balancing帐户ID

时间:2016-07-24 21:48:16

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

我正在尝试创建一个云形成模板,该模板设置一个负载均衡器,将日志写入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的一个示例并没有真正定义变量。

我如何实现这一目标?

修改:我的意思是可用区而不是区域。输入参数为用户提供区域中可用区域的下拉。

2 个答案:

答案 0 :(得分:5)

我明白了。它不是真正的动态,但比直接硬编码id更好。根据{{​​3}},正确的方法是首先定义映射:

{
  "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"
        }
      }
    }
  }
}

答案 1 :(得分:4)

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

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

  1. 对这些帐户ID进行硬编码,
  2. 将输入变量用于模板,或
  3. 尝试使用CloudFormation“地图”设置region-to-account-id列表的地图,然后使用AWS::Region变量选择合适的列表。