AWS ECS 创建两个实例

问题描述 投票:0回答:1

我正在努力配置所需容量为 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

我错过了什么?

amazon-web-services terraform amazon-ecs
1个回答
0
投票

尝试在 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 服务可能会将这种延迟解释为失败并尝试启动第二个任务,这可能会导致两个任务同时运行。

© www.soinside.com 2019 - 2024. All rights reserved.