我正在努力配置所需容量为 1 的 ECS。我为它配置了负载均衡器。这些是我的 terraform 文件的主要设置:
esource "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 时,它会在创建 ECS 之前创建一个 EC2 实例(我认为这是主要问题)。然后,它会自动创建具有之前定义的目标 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 警报触发,该警报指出:“阈值 1 分钟内 1 个数据点的CapacityProviderReservation > 1”
这款手表永远不会更改为 OK 状态,它始终处于闹钟状态。
这是完整的 terraform 配置文件 https://pastebin.com/CqKX8VTm
我错过了什么?
尝试在 ECS 之后创建 ASG,这取决于:
resource "aws_autoscaling_group" "public_ecs_asg" {
name = var.public_ecs.asg.name
vpc_zone_identifier = [aws_subnet.main_vpc_public_subnet_1.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_capacity_provider" "public_ecs_capacity_provider" {
auto_scaling_group_provider {
auto_scaling_group_arn = aws_autoscaling_group.public_ecs_asg.arn
managed_scaling {
status = "ENABLED"
target_capacity = 100
}
}
}
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
}
depends_on = [aws_autoscaling_group.public_ecs_asg]
}
该问题源于 Auto Scaling Group (ASG) 和 ECS 服务之间缺乏同步。 ECS 服务依赖 ASG 提供足够的容量,但如果 ASG 中的伸缩规则或指标不一致,则可能会出现问题。例如,如果任务消耗的资源(CPU、内存)多于 ASG 扩展策略中定义的阈值,则 ASG 可能会尝试通过添加另一个实例来提前扩展。此外,如果 ECS 任务的启动时间比预期长,ECS 服务可能会将这种延迟解释为失败并尝试启动第二个任务,这可能会导致两个任务同时运行。