AWS ECS单容器EC2 ASG托管自动扩缩容失效排查
问题根因
- 核心配置错误:ECS服务显式配置了
launch_type = "EC2",但未关联你创建的容量提供者策略。
你虽然已经将开启托管扩缩容的容量提供者绑定到了ECS集群,但只要服务硬编码指定了launch_type、且未显式配置capacity_provider_strategy,ECS调度器就会走传统EC2启动类型的调度逻辑:仅在当前已注册到集群的存量EC2实例上尝试放置任务,完全不会触发容量提供者的托管扩缩容链路,自然不会通知ASG扩容新实例。这就是任务放置失败、但ASG始终无扩容动作的根本原因。 - 资源预留配置问题:你选用的
t3a.nano/t4g.nano实例标称内存仅512MB,ECS容器代理、系统基础进程本身会预留150~200MB内存,你给任务分配256MB内存时,单实例剩余可分配内存刚好卡临界值,很容易因为系统临时内存占用触发日志里的"insufficient memory available"报错。 - 配置隐患:你将ASG默认冷却时间、应用自动扩缩容策略的扩缩容冷却时间均设为0,虽然不会直接导致扩容失效,但生产环境极易因指标波动产生频繁扩缩容的抖动问题。
修复步骤
- 调整ECS服务配置:删除硬编码的
launch_type = "EC2"字段,新增容量提供者策略块,显式关联你创建的EC2容量提供者,参考配置如下:
resource "aws_ecs_service" "this" { name = local.task_family cluster = aws_ecs_cluster.this.id task_definition = aws_ecs_task_definition.this.arn desired_count = 1 # 移除 launch_type = "EC2" 配置项 capacity_provider_strategy { capacity_provider = aws_ecs_capacity_provider.ec2.name weight = 100 base = 0 } lifecycle { ignore_changes = [desired_count] } }
配置更新后,ECS调度器在存量实例无法满足任务放置需求时,才会正确触发容量提供者的托管扩缩容流程,通知ASG拉起新实例。
- 调整资源配置避免内存不足:要么将实例规格升级为1GB内存的
t3a.micro/t4g.micro,给系统和ECS代理留足预留资源;要么将任务的内存预留调低到192MB以下,确保单nano实例运行1个任务时不会触发资源不足报错。 - (可选优化)调整冷却时间:建议将ASG默认冷却时间、应用自动扩缩容的扩容冷却时间设为60秒,缩容冷却时间设为300秒,避免扩缩容抖动。
- 验证逻辑:配置生效后,将服务期望任务数调整为测试用的5,ECS会识别到存量1台实例无法满足任务放置需求,自动触发ASG扩容对应数量的新实例,待新实例完成初始化、注册到ECS集群后,会自动将待调度任务部署到新实例上,最终运行中任务数达到预期值。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

