如何解决AWS CloudFormation模板中Fn::Sub重复键问题?
问题修复方案
核心问题分析
- 重复Fn::Sub报错:你把
Resource写成了JSON对象,里面重复使用Fn::Sub作为键,违反了JSON键唯一的规则,导致cfn-lint报错,同时CloudFormation解析时会忽略重复键,最终资源无法正确生成。 - 缺少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
相关产品推荐
相关产品推荐

