AWS CloudFormation通过CodeDeploy实现ECS蓝绿部署报错如何解决?
问题核心原因
你的报错是两类配置冲突导致:
- 使用
CODE_DEPLOY作为部署控制器的ECS服务,禁止用户手动创建管理AWS::ECS::TaskSet资源,TaskSet的生命周期完全由CodeDeploy控制 - CloudFormation的
AWS::CodeDeploy::BlueGreenHook要求在ECSAttributes中声明TaskSet逻辑ID,这类资源由Hook自动生成,不需要用户手动在Resources块中定义
具体修改步骤
1. 移除手动定义的冗余资源
删除Resources块中以下两类资源的全部定义:
- 手动声明的
TaskSetBlue资源 - 手动声明的
TaskDefinitionGreen资源(绿版任务定义由Hook在部署更新时自动生成,无需提前定义)
2. 修正ECS服务配置
修改AWS::ECS::Service资源的LoadBalancers字段,初始仅绑定蓝目标组即可,禁止同时绑定蓝绿两个目标组:
EcsService: Type: AWS::ECS::Service DependsOn: LoadBalancerListener Properties: # 其余原有配置保留不变 LoadBalancers: - ContainerName: !Sub ${ServiceName}-container ContainerPort: 8080 TargetGroupArn: !Ref TargetGroupBlue # 其余原有配置保留不变
3. 修正负载均衡监听器配置
修改LoadBalancerListener的默认转发规则,初始全量流量指向蓝目标组,流量切换逻辑由CodeDeploy自动控制,不需要提前配置双目标组权重:
LoadBalancerListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: DefaultActions: - Type: forward TargetGroupArn: !Ref TargetGroupBlue # 其余原有配置保留不变
4. 保留Hook配置不变
Hooks块中的原有配置不需要修改,TaskDefinitions和TaskSets字段声明的逻辑ID为Hook自动生成资源的标识,不需要对应Resources块中的手动定义资源。
部署验证
修改完成后首次创建栈会生成初始蓝环境,后续需要更新服务时,只需修改任务定义中的镜像、配置等参数并更新栈,CloudFormation会自动触发CodeDeploy蓝绿部署流程,完成流量切分和旧版本下线。
提示:你当前配置的ECS服务
DesiredCount为0,首次部署后可根据需要调整为实际需要的运行实例数。
内容的提问来源于stack exchange,提问作者tylerwgrass
相关产品推荐
相关产品推荐

