如何在CloudFormation中为S3桶列表添加ARN前缀与/*后缀?
解决CloudFormation批量生成S3桶ARN白名单的问题
CloudFormation完全支持这种列表操作,下面提供两种可行方案,满足你批量生成带前缀后缀的S3 ARN需求:
方案1:使用Fn::ForEach-2(推荐,CFN新版本支持)
Fn::ForEach-2是CloudFormation的循环处理函数,可以遍历你的桶名列表,为每个桶生成两个ARN(桶本身和桶内所有对象)。
修改后的完整模板如下:
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "This template creates a managed policy for s3 bucket whitelisting (ReadOnly) in AWS", "Parameters" : { "ManagedPolicyName" : { "Type" : "String", "Description" : "Enter a name for the policy being created" }, "RoleAttachement" : { "Type" : "CommaDelimitedList", "Description" : "Enter a comma delimited list of ROLE NAMES the policy needs to be attached to" }, "WhitelistBuckets" : { "Type" : "CommaDelimitedList", "Description" : "Enter a comma delimited list of BUCKET NAMES the policy needs to whitelist" } }, "Resources": { "ManagedPolicy": { "Type": "AWS::IAM::ManagedPolicy", "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "sid": "ConsoleAccess", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:ListAllMyBuckets" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:List*", "s3:Get*" ], "Resource": { "Fn::ForEach-2": [ "BucketName", {"Ref": "WhitelistBuckets"}, [ {"Fn::Sub": "arn:aws:s3:::${BucketName}"}, {"Fn::Sub": "arn:aws:s3:::${BucketName}/*"} ] ] } } ] }, "ManagedPolicyName": {"Ref": "ManagedPolicyName"}, "Roles": {"Ref": "RoleAttachement"} } } } }
说明:
Fn::ForEach-2接收三个参数:循环变量名(这里是BucketName)、要遍历的列表(WhitelistBuckets参数)、每个元素要生成的内容(这里为每个桶生成两个ARN)。Fn::Sub用于拼接ARN字符串,自动替换${BucketName}为当前遍历的桶名。- 最终生成的Resource列表会完全符合你期望的格式。
方案2:字符串拼接+拆分(兼容旧版CFN)
如果你的环境不支持Fn::ForEach-2,可以用Fn::Split和Fn::Join结合的方式实现:
替换Resource部分为:
"Resource": { "Fn::Split": [ ",", { "Fn::Join": [ ",", { "Fn::Map": [ "BucketName", {"Ref": "WhitelistBuckets"}, {"Fn::Sub": "arn:aws:s3:::${BucketName},arn:aws:s3:::${BucketName}/*"} ] } ] } ] }
说明:
- 先为每个桶生成包含两个ARN的字符串(用逗号分隔),再把所有字符串拼接成一个大的逗号分隔字符串,最后用
Fn::Split拆分成列表。
两种方案最终都会生成你需要的ARN列表,推荐优先使用方案1,代码更清晰易维护。
内容的提问来源于stack exchange,提问作者Ismail
相关产品推荐
相关产品推荐

