基于Terraform的ECS蓝绿集群应用自动扩缩容故障求助
我来帮你一步步排查为什么你基于AWS蓝绿部署方案搭建的ECS集群,配置了ECSServiceAverageCPUUtilization目标追踪策略(目标值15%)后,EC2实例却没有出现增减变化。结合Terraform配置场景,下面是最常见的问题和解决方法:
1. 先搞清楚:服务级扩缩≠EC2实例扩缩
你配置的ECSServiceAverageCPUUtilization目标追踪策略,默认只会调整ECS服务的任务数量,不会直接触发EC2实例的扩缩。要让EC2实例跟着资源需求变化,你需要额外配置「ECS容量提供商的托管扩缩」或者「Auto Scaling Group(ASG)的集群级扩缩策略」——这是很多人踩的第一个坑!
如果你的Terraform代码里只给ECS服务加了任务数的扩缩策略,那它只会增减任务,不会动EC2实例。得补全EC2层面的扩缩配置。
2. 检查ECS容量提供商的托管扩缩是否开启
如果你用了ECS容量提供商关联ASG,一定要确保开启了托管扩缩功能:
在Terraform的aws_ecs_capacity_provider资源里,需要配置managed_scaling块,示例如下:
resource "aws_ecs_capacity_provider" "ecs_capacity_provider" { name = "ecs-bluegreen-capacity-provider" auto_scaling_group_provider { auto_scaling_group_arn = aws_autoscaling_group.ecs_asg.arn managed_scaling { status = "ENABLED" target_capacity = 70 # 比如集群资源使用率到70%时触发扩缩 minimum_scaling_step_size = 1 maximum_scaling_step_size = 2 } managed_termination_protection = "ENABLED" } }
同时要记得把这个容量提供商关联到你的ECS集群,并且让ECS服务使用该容量提供商作为部署目标。
3. 验证ASG的集群级扩缩策略是否正确配置
如果没有用容量提供商,而是直接管理ASG,你需要给ASG配置基于ECS集群整体资源指标的扩缩策略,而不是服务级的CPU指标:
比如用ECSClusterCPUUtilization(集群整体CPU使用率)来触发ASG的扩缩。Terraform配置示例:
# 集群CPU过高时触发扩容告警 resource "aws_cloudwatch_metric_alarm" "asg_scale_up" { alarm_name = "ecs-cluster-cpu-high" comparison_operator = "GreaterThanThreshold" evaluation_periods = "2" metric_name = "CPUUtilization" namespace = "AWS/ECS" period = "60" statistic = "Average" threshold = "70" alarm_description = "当ECS集群CPU使用率超过70%时触发扩容" alarm_actions = [aws_autoscaling_policy.asg_scale_up.arn] dimensions = { ClusterName = aws_ecs_cluster.ecs_bluegreen.name } } # ASG扩容策略 resource "aws_autoscaling_policy" "asg_scale_up" { name = "asg-scale-up" scaling_adjustment = 1 adjustment_type = "ChangeInCapacity" cooldown = 300 autoscaling_group_name = aws_autoscaling_group.ecs_asg.name }
注意:服务级CPU指标只反映单个服务的负载,EC2实例扩缩需要看集群整体的资源剩余情况,所以必须用集群级指标。
4. 检查蓝绿部署的服务配置是否限制了任务扩缩
蓝绿部署模式下,ECS服务的部署配置可能会限制任务数的调整:
要确保服务的desired_count、minimum_healthy_percent和maximum_percent设置合理。比如maximum_percent设为200的话,允许在部署期间最多运行两倍的任务数,这样自动扩缩容才能正常调整任务数,进而触发集群资源不足,再带动EC2实例扩缩。
Terraform中服务的部署配置示例:
resource "aws_ecs_service" "ecs_service" { # ...其他配置 deployment_configuration { maximum_percent = 200 minimum_healthy_percent = 50 } }
5. 确认IAM权限是否足够
自动扩缩容需要齐全的IAM权限,否则会静默失败:
- 应用自动扩缩容的角色需要有
ecs:UpdateService权限,用来调整任务数。 - ASG的扩缩容角色需要有
autoscaling:DescribeAutoScalingGroups、autoscaling:UpdateAutoScalingGroup等权限。 - 如果用了容量提供商,ECS服务角色需要有
autoscaling:DescribeAutoScalingGroups、autoscaling:SetDesiredCapacity等权限来管理ASG。
检查你的Terraform中IAM角色的权限策略,确保没有遗漏这些关键权限。
6. 验证CloudWatch指标是否正常采集
去CloudWatch控制台查看ECSServiceAverageCPUUtilization和ECSClusterCPUUtilization指标是否有数据:
- 如果指标为空,可能是任务没有正常运行,或者EC2实例的IAM角色没有
cloudwatch:PutMetricData权限,导致无法上报指标。 - 没有指标数据的话,自动扩缩容策略根本无法触发。
7. 检查扩缩容策略的生效条件是否满足
你设置的目标值是15%,要确认服务的CPU使用率确实持续超过或低于这个阈值:
- 可以在CloudWatch查看服务的CPU使用率曲线,看是否达到了触发条件。
- 另外,目标追踪策略默认有300秒的冷却时间,不会立即触发扩缩,需要等一段时间再观察。
内容的提问来源于stack exchange,提问作者George V. Reilly

