ECS Fargate部署时如何匹配实际运行任务数而非desired count?
解决方案
核心问题根因
你遇到的部署时容量直接回落至2的问题,本质和minimum healthy percent/maximum percent参数无关,是CloudFormation默认会用模板中写死的DesiredCount值覆盖ECS服务当前的实际期望任务数导致的:自动扩缩容把DesiredCount调整为6后,只要CloudFormation模板里DesiredCount固定为2,每次部署都会把这个值重置回2,自然会触发缩容。
可落地的方案按优先级排序:
- 直接移除CloudFormation模板中ECS服务的
DesiredCount显式配置
这是官方推荐的最优方案:当CloudFormation模板的ECS服务定义中不写DesiredCount字段时,更新栈时不会修改服务当前的DesiredCount值,自动扩缩容调整后的数值会被完整保留。此时部署时的minimum healthy percent、maximum percent就会以当前实际的期望任务数(也就是你场景中的6)为基准计算,不会出现容量跳水。 - 在CodePipeline中增加动态获取当前任务数的前置步骤
如果你的流程必须保留模板中的DesiredCount参数配置,可在触发CloudFormation部署的阶段前,加一个自定义执行步骤:- 调用
aws ecs describe-services命令获取当前服务的实际期望任务数 - 将该数值作为动态参数传入CloudFormation更新栈的请求中,替换模板默认的2
这样部署时的DesiredCount就是当前实际运行的数值,部署阶段的容量基准就不会出错。
- 调用
- 额外适配自定义比例的部署需求
如果你需要部署时按当前实际任务数的特定比例启动新任务,可在上述第二步的自定义步骤中增加计算逻辑:拿到当前任务数后,按你需要的比例(比如120%)计算出目标值,再传入CloudFormation即可。
配套参数建议
部署时如果要保证全程容量不低于当前负载要求,可将ECS服务的minimum healthy percent设为100%,maximum percent设为200%,这样部署流程会先启动和当前任务数等量的新任务,健康检查通过后再下线旧任务,全程不会出现容量不足的情况。
内容的提问来源于stack exchange,提问作者gaxunil
相关产品推荐
相关产品推荐

