AWS Cloudformation Elastic Load Balancing 账户 ID
Posted
技术标签:
【中文标题】AWS Cloudformation Elastic Load Balancing 账户 ID【英文标题】:AWS Cloud Formation Elastic Load Balancing Account 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
的示例并没有真正定义变量。
我如何做到这一点?
编辑:我指的是可用区而不是区域。输入参数为用户提供区域中可用区域的下拉列表。
【问题讨论】:
【参考方案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"
【讨论】:
docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html 感谢您提出此解决方案。但是,列出的“PolicyDocument”部分无效。它不包含“语句”块。在“PolicyDocument”之后应该有一个“Statement”部分,如下所示: “Statement” : [ //policy statement// ] 如果这可以帮助我创建此要点的人:gist.github.com/Yanal-Yves/ed6244326f521fb5d7e051447275da41,其中包含当前 25 个可用区域的所有 ELB 帐户 ID。【参考方案2】:没有包含 ELB 帐户 ID 的变量。这些是 AWS 的各种账户标识符。
要将它们包含在您的政策中,您必须:
-
对这些帐户 ID 进行硬编码,
在模板中为它们使用输入变量,或者
尝试使用 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 进行硬编码,或者在模板中为它们使用输入变量。以上是关于AWS Cloudformation Elastic Load Balancing 账户 ID的主要内容,如果未能解决你的问题,请参考以下文章
将现有 AWS 资源整合到 CloudFormation 堆栈中
CloudFormation - 将标签应用于其他 AWS 资源
AWS CloudFormation:Cognito LambdaTrigger CustomEmailSender - 属性“AWS CloudFormation 目前不支持。”和 CDK 的使用