You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:32:48