CloudFormation模板多条件创建资源报错:Condition成员需为字符串
问题分析与解决
错误核心原因
触发Template format error: Every Condition member must be a string的本质是:CloudFormation条件中的所有判断值(包括SSM参数引用结果、条件表达式返回值)必须是字符串类型的"True"或"False",若你的配置中出现非字符串类型的布尔值,就会触发该错误。
常见配置遗漏及修复方案
1. SSM参数类型或值不符合要求
如果SSM参数存储的是原生布尔值(小写true/false),而非字符串格式的"True"/"False",CloudFormation读取后会识别为布尔类型,违反条件的字符串要求。
- 修复:
- 直接修改SSM参数的值为字符串格式的
"True"或"False"; - 或在模板中用
!Sub将参数值强制转为字符串后再判断:Conditions: CreateVpcEndpoint: !Equals [!Sub "${YourSSMParam}", "True"]
- 直接修改SSM参数的值为字符串格式的
2. 条件表达式未做字符串对比
若直接引用SSM参数作为条件值,且参数为布尔类型,会导致错误,比如:
Conditions: CreateVpcEndpoint: !Ref SSMParamCreateVpcEndpoint
- 修复:通过
!Equals明确做字符串值对比,同时确保参数类型声明为字符串:Parameters: SSMParamCreateVpcEndpoint: Type: AWS::SSM::Parameter::Value<String> Default: "/your/param/path/create-vpc-endpoint" SSMParamEcrApiEndpoint: Type: AWS::SSM::Parameter::Value<String> Default: "/your/param/path/ecr-api-endpoint" Conditions: CreateVpcEndpoint: !Equals [!Ref SSMParamCreateVpcEndpoint, "True"] EcrApiEndpoint: !Equals [!Ref SSMParamEcrApiEndpoint, "True"] # 任一条件为True则创建端点 ShouldCreateEcrVPCEndpoint: !Or - !Condition CreateVpcEndpoint - !Condition EcrApiEndpoint Resources: EcrApiVPCEndpoint: Type: AWS::EC2::VPCEndpoint Condition: ShouldCreateEcrVPCEndpoint Properties: VpcId: !Ref YourVpcId ServiceName: !Sub "com.amazonaws.${AWS::Region}.ecr.api" SecurityGroupIds: [!Ref YourSecurityGroupId] SubnetIds: !Ref YourSubnetIds
3. 逻辑嵌套返回非字符串值
若!Or/!And等逻辑函数中嵌套的子条件返回的不是字符串类型布尔值,也会触发错误。需确保所有子条件的判断逻辑都基于字符串对比。
验证要点
- 确认SSM参数的类型为
String,值严格为"True"或"False"; - 所有条件表达式最终返回字符串类型的布尔值,而非原生布尔值;
- 模板中引用SSM参数时,使用
AWS::SSM::Parameter::Value<String>类型声明。
内容的提问来源于stack exchange,提问作者Ranyk
相关产品推荐
相关产品推荐

