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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:00:39