CloudFormation模板!If语句配置网络时遇类型错误:期望JSONObject,实际为String
解决CloudFormation中ECS服务NetworkConfiguration的!If条件类型错误问题
问题场景:
尝试通过CloudFormation模板创建可根据部署环境参数切换Fargate/EC2启动类型的ECS服务,在使用!If条件配置NetworkConfiguration时触发错误:expected type: JSONObject, found: String。硬编码配置时可正常运行,原因是EC2模式下无需配置Awsvpc网络。
错误原因:
原模板中直接给NetworkConfiguration字段赋值为!If的结果,当条件指向EC2模式时返回AWS::NoValue,但CloudFormation对NetworkConfiguration的类型校验要求必须是JSONObject,AWS::NoValue在此场景下会被解析为字符串类型,导致类型不匹配。
解决方案:
将整个NetworkConfiguration属性的存在与否用!If控制,当使用Fargate时才添加该属性,EC2模式下不包含该属性,完全符合ECS服务的配置规则。修改后的模板片段如下:
Conditions: UseEC2: !Equals - dev - !Ref ParameterEnvironment UseFargate: !Not [ !Equals [ dev, !Ref ParameterEnvironment ] ] WebService: Properties: Cluster: !Ref ClusterName DesiredCount: 1 LaunchType: !If [ UseFargate, FARGATE, EC2 ] # 调整:用!If控制是否添加NetworkConfiguration属性 !If - UseFargate - NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: "ENABLED" SecurityGroups: - !Ref AppDefaultGroup - !Ref OtherGroup Subnets: - subnet-xxxxxxxx - subnet-yyyyyyyy - !Ref AWS::NoValue SchedulingStrategy: REPLICA PropagateTags: TASK_DEFINITION TaskDefinition: !Ref WebTaskDefinition Type: 'AWS::ECS::Service'
内容的提问来源于stack exchange,提问作者apokryfos
相关产品推荐
相关产品推荐

