Terraform配置AWS ASG目标追踪扩缩容策略为何报错?
核心原因
报错的本质是你的Terraform配置没有正确适配ECS Fargate服务的目标追踪扩缩容规则,导致AWS将请求误判为需要步骤扩缩容配置。具体可能是以下几个问题:
1. 可扩展目标配置错误
ECS Fargate服务的可扩展目标需要明确指定service_namespace = "ecs"、scalable_dimension = "ecs:service:DesiredCount",且resource_id格式必须为service/<集群名>/<服务名>。如果你的aws_appautoscaling_target资源用了EC2 ASG的配置(比如service_namespace = "autoscaling"),AWS会默认按EC2 ASG的规则处理,参数不匹配就会触发错误。
2. 策略参数块不匹配
使用目标追踪策略时,必须在aws_appautoscaling_policy中配置target_tracking_scaling_policy_configuration块,而非step_scaling_policy_configuration。如果代码混用了块,或者目标追踪块的必填参数(如target_value、predefined_metric_specification)缺失,AWS会无法识别目标追踪类型,进而要求提供步骤扩缩容配置。
3. 预定义指标类型错误
针对ECS Fargate的CPU利用率目标追踪,预定义指标类型必须是ECSServiceAverageCPUUtilization,不能用EC2 ASG的ASGAverageCPUUtilization。指标类型写错会导致AWS无法找到对应指标,最终触发策略类型识别失败。
正确配置示例
以下是适配ECS Fargate的目标追踪扩缩容Terraform代码:
# 注册ECS服务为可扩展目标 resource "aws_appautoscaling_target" "fargate_scaling_target" { max_capacity = 8 min_capacity = 2 resource_id = "service/${aws_ecs_cluster.my_cluster.name}/${aws_ecs_service.my_fargate_service.name}" scalable_dimension = "ecs:service:DesiredCount" service_namespace = "ecs" } # CPU利用率目标追踪策略 resource "aws_appautoscaling_policy" "cpu_target_scaling" { name = "cpu-target-scaling" policy_type = "TargetTrackingScaling" resource_id = aws_appautoscaling_target.fargate_scaling_target.resource_id scalable_dimension = aws_appautoscaling_target.fargate_scaling_target.scalable_dimension service_namespace = aws_appautoscaling_target.fargate_scaling_target.service_namespace target_tracking_scaling_policy_configuration { target_value = 60.0 # 目标CPU利用率60% predefined_metric_specification { predefined_metric_type = "ECSServiceAverageCPUUtilization" } scale_in_cooldown = 300 # 缩容冷却时间5分钟 scale_out_cooldown = 180 # 扩容冷却时间3分钟 } }
验证要点
- 确认
aws_appautoscaling_target的service_namespace是ecs,而非autoscaling - 检查
resource_id格式是否符合service/<集群名>/<服务名> - 确保
aws_appautoscaling_policy的policy_type为TargetTrackingScaling,且仅配置target_tracking_scaling_policy_configuration块 - 预定义指标类型必须匹配ECS服务的指标,不能用EC2 ASG的指标
内容的提问来源于stack exchange,提问作者RAH

