如何在CloudFormation中按条件部署TaskDefinition内的ContainerDefinition
CloudFormation条件控制ECS任务定义容器部署方案
报错原因
CloudFormation的Condition字段仅支持直接添加在资源根层级(与Type、Properties平级),不支持嵌套在资源属性的子配置中,因此你直接在ContainerDefinitions的容器配置内加Condition会触发非法字段校验错误。
该需求可以完全实现,常用两种方案:
方案1:使用Fn::If + AWS::NoValue动态构造容器数组(推荐)
直接在ContainerDefinitions数组内使用CloudFormation内置条件函数,动态控制是否注入目标容器:
Type: 'AWS::ECS::TaskDefinition' Properties: RequiresCompatibilities: - FARGATE # 其他公共属性配置 ContainerDefinitions: - Name: someServiceName # 固定部署的容器的其他配置 - !If - IsProduction # 你预先定义的条件名 # 条件成立时返回的容器配置 - Name: ServiceToDeployBasedOnCondition Image: xxx # 目标容器的其他所有配置 # 条件不成立时返回AWS::NoValue,CloudFormation会自动移除该数组项 - !Ref AWS::NoValue
该方案无需拆分资源,改动量最小,适合绝大多数场景。
方案2:拆分多版本任务定义资源
如果条件容器的关联逻辑非常复杂,也可以定义两个完整的TaskDefinition资源,分别绑定根层级的Condition:
Conditions: IsProduction: !Equals [!Ref EnvType, prod] Resources: ProdTaskDefinition: Condition: IsProduction Type: 'AWS::ECS::TaskDefinition' Properties: # 带额外容器的完整配置 CommonTaskDefinition: Condition: !Not [!Condition IsProduction] Type: 'AWS::ECS::TaskDefinition' Properties: # 不带额外容器的完整配置
该方案需要后续引用TaskDefinition的位置使用!If [IsProduction, !Ref ProdTaskDefinition, !Ref CommonTaskDefinition]动态切换引用,适合配置差异较大的场景。
内容的提问来源于stack exchange,提问作者Ernesto98
相关产品推荐
相关产品推荐

