部署时如何配置EC2自动扩缩容实现ECS服务无停机更新
配置方案
基础配置(推荐,无需改动现有部署流程)
- 切换ECS服务为REPLICA模式,调整任务定义的CPU/内存配额为单台EC2实例的可用资源上限,确保单实例仅能运行1个任务。
- 为ECS集群绑定关联了EC2 ASG的ECS容量提供者,开启托管式扩缩容:
- 容量提供者的扩容触发逻辑基于待调度PENDING任务的资源缺口,而非现有实例的CPU/内存利用率,部署时新任务因资源不足进入排队状态后会自动触发EC2实例扩容,完全适配你的场景。
- 开启容量提供者的任务缩容保护,避免部署过程中正在运行任务的实例被提前回收,设置缩容冷却时间≥服务启动+健康检查的总耗时。
- 调整服务部署策略参数:
- 设置
minimumHealthyPercent = 100,保证部署过程中始终有正常运行的服务副本,无停机时间。 - 设置
maximumPercent = 200,允许部署过程中同时存在新旧两个版本的任务,等新版本任务健康检查通过后再自动终止旧版本任务。
- 设置
- 部署完成后,旧任务终止后对应的EC2实例进入空闲状态,容量提供者会在冷却时间到期后自动缩容空闲实例,不会产生长期闲置成本。
自定义控制方案(适配已有CI/CD流程)
如果需要更可控的扩缩容时机,可直接在部署流程中加入主动扩缩容步骤:
- 部署前执行
aws autoscaling set-desired-capacity --auto-scaling-group-name <你的ASG名称> --desired-capacity $((当前ASG期望实例数 + 1)),临时扩容1台EC2实例。 - 等待实例注册到ECS集群后触发正常的服务部署流程,等待新版本任务全部健康、旧版本任务完全终止。
- 部署完成后执行
aws autoscaling set-desired-capacity --auto-scaling-group-name <你的ASG名称> --desired-capacity <原期望实例数>,回收冗余的EC2实例。
原有逻辑说明
你之前使用的基于CPU/内存利用率的ASG扩缩容是常规的负载感知策略,部署时旧任务仍在运行、实例负载已满,但新任务尚未启动,不会产生利用率变化因此无法触发扩容,属于正常逻辑,并不是你对扩缩容的理解有误。
内容的提问来源于stack exchange,提问作者JamieDF
相关产品推荐
相关产品推荐

