如何在X次任务失败后取消AWS CDK部署并执行回滚?
在AWS CDK中配置ECS服务部署失败自动回滚策略
可以通过两种方式实现部署失败后自动取消并回滚:
1. 利用ECS原生部署停止条件配置
ECS支持在部署过程中设置停止条件,当任务失败次数达到阈值时自动终止部署并回滚到上一个稳定版本。在CDK的ApplicationLoadBalancedEc2Service中,可通过deploymentConfiguration参数配置:
import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ecspatterns from 'aws-cdk-lib/aws-ecs-patterns'; const loadBalancedService = new ecspatterns.ApplicationLoadBalancedEc2Service(this, 'MyService', { // 其他基础配置(如taskDefinition、cluster等) deploymentController: { type: ecs.DeploymentControllerType.ECS, }, deploymentConfiguration: { maximumPercent: 200, minimumHealthyPercent: 50, stopConditions: [ { failureThreshold: 3, // 设置允许的任务失败次数 action: ecs.DeploymentStopAction.ROLLBACK, // 触发回滚操作 }, ], }, });
该配置会让ECS在部署时,当连续失败任务数达到设定阈值,自动停止当前部署流程并回滚至之前的稳定版本。
2. 自定义CloudWatch告警+Lambda回滚
若需要更灵活的失败判定逻辑(比如基于累计失败次数、特定错误类型),可通过CloudWatch监控ECS任务失败指标,触发Lambda执行回滚操作:
步骤1:创建CloudWatch告警
监控ECS服务的TaskFailedToStart指标,设置阈值为你需要的失败次数:import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch'; import * as actions from 'aws-cdk-lib/aws-cloudwatch-actions'; import * as lambda from 'aws-cdk-lib/aws-lambda'; const taskFailedAlarm = new cloudwatch.Alarm(this, 'TaskFailedAlarm', { metric: loadBalancedService.service.metricTaskFailedToStart(), threshold: 5, evaluationPeriods: 1, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, });步骤2:编写Lambda回滚函数
创建Lambda函数,调用ECS API将服务回滚到上一版本或暂时将任务数设为0:const rollbackLambda = new lambda.Function(this, 'RollbackLambda', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromInline(` const AWS = require('aws-sdk'); const ecs = new AWS.ECS(); exports.handler = async (event) => { const params = { service: '${loadBalancedService.service.serviceName}', cluster: '${cluster.clusterName}', desiredCount: 0, // 先停止所有任务,也可配置回滚到上一版本 }; await ecs.updateService(params).promise(); return { statusCode: 200, body: 'Rollback initiated' }; }; `), }); // 给Lambda授予修改ECS服务的权限 loadBalancedService.service.grantUpdateService(rollbackLambda);步骤3:关联告警与Lambda
配置CloudWatch告警触发Lambda执行回滚:taskFailedAlarm.addAlarmAction(new actions.LambdaAction(rollbackLambda));
注意事项
- 原生配置方式更简洁,适合基础的连续失败场景;自定义方式灵活性更高,可适配复杂的失败判定逻辑。
- 确保CDK部署使用的IAM角色拥有足够权限配置ECS部署停止条件或调用ECS API。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

