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

如何在ECS Circuit Breaker触发时让AWS Code Pipeline部署失败?

让CodePipeline在ECS断路器触发时标记部署失败的方案

下面是几个可行的解决思路,核心都是让部署流程能感知到ECS的回滚动作:

1. 在CloudFormation模板中添加自定义资源校验ECS状态

在你的CloudFormation模板里新增一个Lambda-backed自定义资源,让它在ECS服务更新完成后,检查服务的部署状态:

  • 调用ECS的DescribeServices接口,筛选出失败的部署记录,同时确认当前运行的任务定义是否为模板指定的新版本
  • 如果发现存在失败部署,且当前运行的是旧版本(说明断路器触发了回滚),就让自定义资源返回失败状态,强制CloudFormation栈更新失败,进而让CodePipeline标记部署阶段失败
  • 附Lambda代码片段参考:
import boto3

ecs = boto3.client('ecs')

def lambda_handler(event, context):
    service_arn = event['ResourceProperties']['ServiceArn']
    resp = ecs.describe_services(services=[service_arn])
    service = resp['services'][0]
    
    # 筛选失败的部署记录
    failed_deploys = [d for d in service['deployments'] if d['status'] == 'FAILED']
    # 获取当前正在运行的部署
    running_deploy = next(d for d in service['deployments'] if d['runningCount'] > 0)
    # 提取模板预期的任务定义版本
    expected_rev = service['taskDefinition'].split('/')[-1]
    
    if failed_deploys and running_deploy['revision'] != expected_rev:
        return {
            'Status': 'FAILED',
            'Reason': 'ECS部署触发断路器回滚,流水线终止'
        }
    return {'Status': 'SUCCESS'}
  • 注意给Lambda配置ecs:DescribeServices权限,并在模板中用DependsOn确保自定义资源在ECS服务更新完成后执行

2. 在CodePipeline中新增独立验证阶段

无需修改CloudFormation模板,直接在流水线的CloudFormation部署阶段后添加一个Lambda调用阶段:

  • Lambda逻辑和上述一致,检查ECS服务的部署状态,判断是否触发断路器回滚
  • 若检测到回滚,Lambda返回失败状态,CodePipeline会直接标记整个流水线为失败
  • 优势是对现有CloudFormation栈无侵入,配置更灵活

3. 结合CloudFormation栈漂移检测(辅助方案)

开启CloudFormation栈漂移检测,在流水线中新增阶段检查漂移状态:

  • 当ECS回滚到旧版本时,栈内ECS服务关联的任务定义会与模板预期不一致,产生漂移
  • 调用CloudFormation的DetectStackDrift接口,若检测到漂移则标记流水线失败
  • 注意:该方法可能存在误判(如手动修改服务配置也会触发漂移),建议结合ECS部署状态检查一起使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:16:04