AWS ECS自动扩缩容逻辑问题:定时与动态扩缩冲突排查
ECS自动扩缩容定时策略与动态策略冲突导致服务崩溃问题排查
问题背景
- 负责的ECS任务自动扩缩容模块包含三种策略:基于资源消耗的动态扩缩、基于Cron的定时扩缩、基于SQS队列长度的扩缩
- 核心故障:每日8点定时扩缩正常启动50个实例,但动态扩缩因实例利用率低触发缩容,半小时后流量激增导致服务崩溃
- 配置采用Terraform模块,多数参数为外部传入
关键排查方向与修复建议
1. 扩缩容策略优先级与实例保护配置
ECS应用自动扩缩(Application Auto Scaling)默认允许多策略并行生效,若未做优先级或实例保护配置,动态缩容会无差别回收定时启动的实例:
- 设置策略优先级:在Terraform的
aws_appautoscaling_scheduled_action中,通过priority参数给定时扩缩策略设置更高优先级(比如10),确保其期望实例数优先于动态策略的计算结果 - 启用实例保护:给定时启动的实例添加
aws:autoscaling:protected-from-scale-in标签,避免被动态缩容策略回收。示例Terraform配置:
resource "aws_autoscaling_group" "ecs_asg" { # 其他ASG配置项 tag { key = "aws:autoscaling:protected-from-scale-in" value = "true" propagate_at_launch = true } }
可配合另一个定时任务,在流量高峰期结束后(比如9点)取消实例保护。
2. 动态扩缩容阈值与冷却时间调整
动态策略的缩容阈值或冷却时间设置不合理,会导致刚扩容的实例被快速回收:
- 临时调整缩容阈值:通过定时策略在8点时调高动态缩容的CPU/内存利用率阈值(比如从30%改为10%),8:30流量高峰期到来后再调回原阈值。示例Terraform动态策略配置调整:
resource "aws_appautoscaling_target_tracking_scaling_policy" "ecs_dynamic_scale" { # 其他配置 target_value = var.scale_in_threshold # 外部传入参数,定时任务可动态修改该值 scale_in_cooldown = 3600 # 延长缩容冷却时间至1小时,避免立即触发缩容 }
- 延长缩容冷却时间:将动态策略的
scale_in_cooldown设置为3600秒(1小时),给流量增长留出缓冲窗口。
3. 定时扩缩容的时间范围配置
若定时策略仅设置单次扩容动作,未维持实例数到流量高峰期结束,会导致动态策略接管后缩容:
- 配置定时策略的时间窗口:在
aws_appautoscaling_scheduled_action中设置start_time和end_time,确保从8点到9点(或流量结束时间)维持50个实例的期望容量:
resource "aws_appautoscaling_scheduled_action" "ecs_scheduled_scale" { service_namespace = "ecs" scalable_dimension = "ecs:service:DesiredCount" resource_id = "service/${var.cluster_name}/${var.service_name}" schedule = "cron(0 8 * * ? *)" # 每日8点触发 desired_capacity = 50 start_time = "2024-01-01T08:00:00Z" end_time = "2024-01-01T09:00:00Z" # 维持到9点 }
4. 多策略交互逻辑验证
确认Application Auto Scaling的策略交互规则:当定时策略设置了desired_capacity,动态策略的目标追踪计算结果会被覆盖吗?默认情况下,多个策略会取最大的期望实例数。若动态策略计算出的期望数低于50,需检查:
- 动态策略的
scale_in_cooldown是否生效 - 定时策略的
priority是否高于动态策略
内容的提问来源于stack exchange,提问作者Assaf
相关产品推荐
相关产品推荐

