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

如何让Pulumi部署AWS Fargate时遇致命健康检查直接终止部署?

AWS Fargate部署优化:实现健康检查三种状态快速终止失败部署

问题背景

使用Pulumi部署应用到AWS Fargate时,健康部署约10分钟即可完成,但不健康部署会因Fargate反复重启实例,需等待45分钟才判定失败。实际上99%的失败案例在部署后1分钟内就能确认,因此需要健康检查支持三种状态:

  • 健康:逐步停止旧版本应用,将全部流量切换至新版本
  • 待定:暂无法确定状态,继续等待
  • 终止部署:直接终止本次部署,保留旧版本应用处理请求

核心需求:当应用报告「代码已损坏,部署无法成功,请终止」时,Fargate停止重启并终止部署。

当前配置

const lb = new awsx.classic.lb.ApplicationLoadBalancer('app-alb', {})

const lbTargetGroup = new awsx.classic.lb.ApplicationTargetGroup(
  'app-targetgroup',
  {
    loadBalancer: lb,
    protocol: 'HTTP',
    port: appConfig.requireNumber('webPort'),
    healthCheck: {
      protocol: 'HTTP',
      path: '/health',
      unhealthyThreshold: 10,
      healthyThreshold: 2,
      timeout: 20,
      interval: 30,
      matcher: '200',
    },
  }
)

解决方案

AWS ALB的健康检查matcher本身不支持直接定义三种状态,但可以通过自定义状态码匹配+ECS部署策略配置实现类似逻辑,核心是用不同HTTP状态码区分三种状态,再通过健康检查阈值和部署回滚规则快速终止失败部署。

1. 调整应用健康检查接口的状态码返回

修改应用的/health接口,按以下规则返回状态码:

  • 健康:返回200 OK(表示应用已就绪,可接收流量)
  • 待定:返回429 Too Many Requests或503 Service Unavailable(表示应用正在启动初始化,暂未就绪但无致命错误)
  • 终止部署:返回500 Internal Server Error或自定义5xx状态码(如599,明确表示部署无法成功)

2. 修改Target Group健康检查配置

调整健康检查的匹配规则和阈值,快速识别致命错误:

const lb = new awsx.classic.lb.ApplicationLoadBalancer('app-alb', {})

const lbTargetGroup = new awsx.classic.lb.ApplicationTargetGroup(
  'app-targetgroup',
  {
    loadBalancer: lb,
    protocol: 'HTTP',
    port: appConfig.requireNumber('webPort'),
    healthCheck: {
      protocol: 'HTTP',
      path: '/health',
      // 匹配健康(200)和待定(429/503)状态码
      matcher: '200,429,503',
      // 连续2次返回非匹配状态(即500/599等)就标记为不健康
      unhealthyThreshold: 2,
      healthyThreshold: 2,
      timeout: 20,
      // 缩短检查间隔,加快状态识别
      interval: 10,
    },
  }
)

3. 配置ECS服务的部署回滚策略

在ECS服务配置中添加部署控制和回滚规则,确保检测到不健康实例时自动终止部署并回滚到旧版本:

const ecsService = new awsx.ecs.FargateService('app-service', {
  cluster: cluster, // 替换为你的ECS集群实例
  taskDefinition: taskDef, // 替换为你的任务定义实例
  loadBalancers: [{
    targetGroup: lbTargetGroup,
    containerName: 'app-container', // 替换为你的容器名称
    containerPort: appConfig.requireNumber('webPort'),
  }],
  deploymentConfiguration: {
    maximumPercent: 200, // 允许同时运行新旧版本实例,保证更新过程中服务不中断
    minimumHealthyPercent: 100, // 确保旧版本实例始终保持健康可用
  },
  rollbackConfiguration: {
    rollbackTrigger: {
      type: 'ECS_SERVICE_DEPLOYMENT_FAILURE',
      threshold: 1, // 只要出现1次部署失败就触发回滚
    },
  },
})

逻辑说明

  • 健康状态:应用返回200,健康检查通过,ECS会逐步替换旧实例,完成流量切换。
  • 待定状态:应用返回429/503,健康检查仍视为有效状态,ECS会继续等待,不会重启实例,直到应用就绪或转为致命状态。
  • 终止部署:应用返回500/599(不在matcher列表中),连续2次检查失败后标记为不健康,ECS触发部署失败,自动回滚到旧版本,停止重启新实例,旧版本继续处理请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:24