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
相关产品推荐
相关产品推荐

