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

AWS ECS配置异常:Terraform部署后CloudWatch告警持续触发排查

问题

我正尝试配置一个期望容量为1的AWS ECS集群,且已配置负载均衡。以下是我的Terraform文件核心配置:

resource "aws_autoscaling_group" "public_ecs_asg" {
    name = var.public_ecs.asg.name

    vpc_zone_identifier = [aws_subnet.main_vpc_public_subnet_1.id, aws_subnet.main_vpc_public_subnet_2.id]

    min_size            = var.public_ecs.asg.ec2_min_instances
    max_size            = var.public_ecs.asg.ec2_max_instances
    desired_capacity    = 1
}


resource "aws_ecs_service" "public_ecs_service" {
    name            = var.public_ecs.service_name
    cluster         = aws_ecs_cluster.public_ecs_cluster.id
    task_definition = aws_ecs_task_definition.public_ecs_task_definition.arn
    desired_count   = 1
}

resource "aws_ecs_capacity_provider" "public_ecs_capacity_provider" {
    name = var.public_ecs.capacity_provider_name

    auto_scaling_group_provider {
        auto_scaling_group_arn = aws_autoscaling_group.public_ecs_asg.arn

        managed_scaling {
            maximum_scaling_step_size = 1
            minimum_scaling_step_size = 1
            status                    = "ENABLED"
            target_capacity           = 1
        }
    }
}

执行Terraform部署时,EC2实例先于ECS集群创建。随后AWS自动创建了目标值为1的ASG动态伸缩策略:

{
  "CustomizedMetricSpecification": {
    "MetricName": "CapacityProviderReservation",
    "Namespace": "AWS/ECS/ManagedScaling",
    "Dimensions": [
      {
        "Name": "CapacityProviderName",
        "Value": "public-ecs-capacity-provider"
      },
      {
        "Name": "ClusterName",
        "Value": "public-ecs-cluster"
      }
    ],
    "Statistic": "Average"
  }
}

该策略由AWS创建的CloudWatch告警触发,告警规则为:“阈值:CapacityProviderReservation > 1,1分钟内1个数据点”。此告警始终处于触发状态,从未恢复正常。

解决方案
  • 未将容量提供者关联到ECS集群:创建容量提供者后,必须将其附加到目标ECS集群,否则ECS无法识别该容量提供者。需添加aws_ecs_cluster_capacity_providers资源:
resource "aws_ecs_cluster_capacity_providers" "public_ecs_cluster_cp" {
  cluster_name = aws_ecs_cluster.public_ecs_cluster.id
  capacity_providers = [aws_ecs_capacity_provider.public_ecs_capacity_provider.name]
  default_capacity_provider_strategy {
    capacity_provider = aws_ecs_capacity_provider.public_ecs_capacity_provider.name
    weight            = 1
    base              = 0
  }
}
  • ECS服务未指定容量提供者策略:当前ECS服务未明确使用自定义容量提供者,会沿用集群默认策略(若存在)。需在aws_ecs_service中添加策略配置:
resource "aws_ecs_service" "public_ecs_service" {
    name            = var.public_ecs.service_name
    cluster         = aws_ecs_cluster.public_ecs_cluster.id
    task_definition = aws_ecs_task_definition.public_ecs_task_definition.arn
    desired_count   = 1

    capacity_provider_strategy {
      capacity_provider = aws_ecs_capacity_provider.public_ecs_capacity_provider.name
      weight            = 1
      base              = 0
    }
}
  • EC2实例未正确注册到ECS集群:EC2实例必须通过ECS代理注册到目标集群,需检查启动模板/配置中的用户数据是否包含集群名称,同时确保实例IAM角色拥有AmazonEC2ContainerServiceforEC2Role权限。用户数据示例:
#!/bin/bash
echo "ECS_CLUSTER=${aws_ecs_cluster.public_ecs_cluster.name}" >> /etc/ecs/ecs.config
  • 容量提供者target_capacity配置错误:target_capacity代表的是集群容量的使用率百分比(范围0-100),而非实例数量。设置为1会让Managed Scaling判定容量严重不足,持续触发告警。修正为100:
managed_scaling {
    maximum_scaling_step_size = 1
    minimum_scaling_step_size = 1
    status                    = "ENABLED"
    target_capacity           = 100
}

内容的提问来源于stack exchange,提问作者xdev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:52:26