AWS CloudFormation中使用!Sub参数化IAM资源名称报错排查
问题分析与解决
这个错误的核心原因是GroupName属性被解析为非字符串类型,而CloudFormation明确要求该属性必须是字符串。以下是最常见的问题场景及修复方案:
常见错误场景1:错误将GroupName定义为列表
如果你的模板中GroupName字段是以下写法(不小心用了列表语法):
RkVpcEksctlPolicyGroup: Type: AWS::IAM::Group Properties: GroupName: - !Sub "${Prefix}-RkVpcEksctlPolicyGroup"
这种写法会让GroupName变成列表类型,直接触发类型错误。
修复方案:去掉列表符号,直接将!Sub结果赋值给GroupName:
RkVpcEksctlPolicyGroup: Type: AWS::IAM::Group Properties: GroupName: !Sub "${Prefix}-RkVpcEksctlPolicyGroup"
常见错误场景2:!Sub引用的变量非字符串类型
如果Prefix这类被引用的变量是数字、列表等非字符串类型(比如参数定义时用了Number或List<String>),!Sub拼接后的结果可能无法被识别为纯字符串。
修复方案:确保被引用的变量是字符串类型。比如参数定义:
Parameters: Prefix: Type: String Default: "MyApp"
常见错误场景3:!Sub语法错误
如果使用!Sub的数组格式(带变量映射),但映射格式错误或变量未定义,也可能导致解析失败返回非字符串。
错误写法:
GroupName: !Sub ["${Prefix}-${Suffix}", {"Prefix": "MyApp"}] # 缺少Suffix变量的定义
修复方案:确保所有变量都在映射中定义完整:
GroupName: !Sub ["${Prefix}-${Suffix}", {"Prefix": "MyApp", "Suffix": "RkVpcEksctlPolicyGroup"}]
验证方法
你可以先简化GroupName的值为纯字符串测试,比如:
GroupName: "Test-RkVpcEksctlPolicyGroup"
如果这个写法不报错,说明问题确实出在!Sub的使用或变量类型上,再逐步排查!Sub的语法和变量定义即可。
内容的提问来源于stack exchange,提问作者Manikanta Reddy
相关产品推荐
相关产品推荐

