如何在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
相关产品推荐
相关产品推荐

