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

ECS集群关联容量提供商时CloudFormation回滚删除失败求助

解决CloudFormation回滚时ECS容量提供商无法删除的问题

核心问题原因

CloudFormation默认按反向创建顺序删除资源,但你的模板直接在ECS Cluster资源中绑定了容量提供商,导致删除时集群和容量提供商互相依赖:删除集群时容量提供商还处于关联状态,删除容量提供商时又提示绑定着集群,最终回滚操作失败。

最优解决方案:用专门的关联资源管理集群与容量提供商的绑定

AWS提供了AWS::ECS::ClusterCapacityProviderAssociations原生资源,专门用于管理ECS集群和容量提供商的关联关系。通过将绑定逻辑从Cluster资源中剥离,让CloudFormation自动处理删除顺序(先删除关联关系,再删除容量提供商和集群),彻底解决依赖冲突。

修改后的模板示例

Resources:
  EcsCluster:
    Type: 'AWS::ECS::Cluster'
    Properties:
      ClusterName: !Sub 'EcsCluster-${EnvName}'
      # 移除原有的CapacityProviders和DefaultCapacityProviderStrategy配置

  # 新增关联资源,单独管理集群与容量提供商的绑定
  ClusterCapacityProviderAssoc:
    Type: AWS::ECS::ClusterCapacityProviderAssociations
    Properties:
      Cluster: !Ref EcsCluster
      CapacityProviders:
        - !Ref OnDemandCapacityProvider
        - !Ref SpotFleetCapacityProvider
      DefaultCapacityProviderStrategy: 
        - CapacityProvider: !Ref OnDemandCapacityProvider
          Base: 2
          Weight: 0
        - CapacityProvider: !Ref SpotFleetCapacityProvider
          Base: 0
          Weight: 1

  OnDemandCapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref OnDemandEcsInstanceAsg
        ManagedScaling:
          MaximumScalingStepSize: 2
          MinimumScalingStepSize: 1
          Status: ENABLED
          TargetCapacity: 100
        ManagedTerminationProtection: ENABLED

  SpotFleetCapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref SpotEcsInstanceAsg
        ManagedScaling:
          MaximumScalingStepSize: 2
          MinimumScalingStepSize: 1
          Status: ENABLED
          TargetCapacity: 100
        ManagedTerminationProtection: DISABLED

效果说明

  • 创建堆栈时:CloudFormation会先创建容量提供商,再创建集群,最后创建关联资源完成绑定。
  • 删除/回滚时:CloudFormation会先删除ClusterCapacityProviderAssoc资源(自动执行解绑操作),再依次删除容量提供商和集群,不会出现关联冲突。

临时修复现有失败堆栈

对于已经处于失败状态的堆栈,需要手动执行解绑操作后再删除:

  1. 打开ECS控制台,找到目标集群
  2. 在"容量提供商"标签页中,移除关联的OnDemand和Spot容量提供商
  3. 回到CloudFormation控制台,重新执行删除/回滚操作

备选方案:用自定义资源实现解绑(适合无法重构模板的场景)

如果无法修改现有模板结构,可以通过Lambda-backed自定义资源,在删除容量提供商前自动调用ECS API解绑:

  1. 创建Lambda函数,处理自定义资源的Delete事件,调用DeregisterCapacityProvider API移除关联
  2. 在模板中添加自定义资源,让容量提供商的删除依赖于该自定义资源
  3. 自定义资源触发时自动完成解绑,再执行容量提供商的删除

不过该方案需要额外维护Lambda函数,推荐优先使用官方原生的关联资源方案。

内容的提问来源于stack exchange,提问作者Chandika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:55:34