You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Terraform的ECS蓝绿集群应用自动扩缩容故障求助

排查ECS蓝绿集群EC2实例不自动扩缩的问题

我来帮你一步步排查为什么你基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:25:36