You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CloudFormation通过CodeDeploy实现ECS蓝绿部署报错如何解决?

问题核心原因

你的报错是两类配置冲突导致:

  1. 使用CODE_DEPLOY作为部署控制器的ECS服务,禁止用户手动创建管理AWS::ECS::TaskSet资源,TaskSet的生命周期完全由CodeDeploy控制
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:57:03