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

如何解决AWS CloudFormation模板中Fn::Sub重复键问题?

问题修复方案

核心问题分析

  1. 重复Fn::Sub报错:你把Resource写成了JSON对象,里面重复使用Fn::Sub作为键,违反了JSON键唯一的规则,导致cfn-lint报错,同时CloudFormation解析时会忽略重复键,最终资源无法正确生成。
  2. 缺少Policy Version:IAM策略文档必须指定Version字段(推荐用2012-10-17,这是当前标准版本),否则控制台会提示警告,且可能影响策略的解析逻辑。

修复后的模板代码

"RolePolicies": {
    "Type": "AWS::IAM::Policy",
    "Properties": {
        "PolicyName": "GetGEBucketPutCustomerBucket",
        "PolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        "s3:PutObject",
                        "s3:GetObject",
                        "s3:GetObjectAttributes",
                        "s3:GetObjectTagging",
                        "s3:ListBucket",
                        "s3:DeleteObject"
                    ],
                    "Effect": "Allow",
                    "Resource": [
                        {
                            "Fn::Sub": "${CustomerS3BucketARN}"
                        },
                        {
                            "Fn::Sub": "${CustomerS3BucketARN}/*"
                        }
                    ]
                }
            ]
        },
        "Roles": [
            {
                "Ref": "InstanceRole"
            }
        ]
    },
    "Metadata": {
        "AWS::CloudFormation::Designer": {
            "id": "a713fcc6-95c8-423f-a5b8-0020a81e5ce4"
        }
    }
}

关键修改说明

  • Resource字段改为数组:IAM策略的Resource支持多个资源,必须用数组形式包裹每个资源的Fn::Sub,避免重复键问题。
  • 简化Fn::Sub写法:直接在Sub字符串中引用参数名${CustomerS3BucketARN},无需嵌套Ref,CloudFormation会自动解析参数值,代码更简洁。
  • 添加Version字段:在PolicyDocument中加入"Version": "2012-10-17",符合IAM策略规范,消除控制台警告。

内容的提问来源于stack exchange,提问作者Lacrosse343

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:15:45