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

