Не удалось добавить поставщика мощностей в кластер AWS ECS с помощью terraform

#amazon-web-services #terraform #amazon-ecs #terraform-provider-aws

#amazon-web-services #terraform #amazon-ecs #terraform-provider-aws

Вопрос:

Я пытаюсь добавить поставщика мощностей в кластер ECS с помощью terraform, чтобы он мог автоматически масштабироваться. Группе автоматического масштабирования необходимо знать кластер для создания экземпляров в кластере, но кластеру также необходимо знать группу автоматического масштабирования через своего поставщика мощностей. Как я могу разрешить эту циклическую зависимость с помощью terraform и поставщика мощностей?

Вот мой инфраструктурный код для создания кластера

 # The ECS cluster
resource "aws_ecs_cluster" "my_cluster" {
  name = "my-cluster"
  capacity_providers = [aws_ecs_capacity_provider.my_cp.name]
}

# The capacity provider
resource "aws_ecs_capacity_provider" "my_cp" {
  name = "my-cp"

  auto_scaling_group_provider {
    auto_scaling_group_arn         = aws_autoscaling_group.my_asg.arn
    managed_termination_protection = "DISABLED"

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

Вот код инфраструктуры для группы автоматического масштабирования и ее зависимостей

 # The image for the cluster instances 
data "aws_ssm_parameter" "instance_image" {
  name = "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
}

# The launch config of the instances
resource "aws_launch_configuration" "my_launch_config" {
  name          = "my-launch-config"
  image_id      = data.aws_ssm_parameter.instance_image.value
  instance_type = "t3.small"
  iam_instance_profile = my_iam_profile
  security_groups = my_security_groups
  associate_public_ip_address = false
  key_name = "my-keypair"

}

# The placement group of the autosclaing group
resource "aws_placement_group" "my_pg" {
  name     = "my-pg"
  strategy = "spread"
}

# The autoscaling gorup
resource "aws_autoscaling_group" "my_asg" {
  name                      = "my-asg"
  max_size                  = 2
  min_size                  = 1
  desired_capacity          = 1

  health_check_type         = "EC2"
  health_check_grace_period = 300

  force_delete              = true
  placement_group           = aws_placement_group.my_pg.id
  launch_configuration      = aws_launch_configuration.my_launch_config.id
  vpc_zone_identifier       = my_subnets_ids


  tag {
    key                 = "Name"
    value               = "myInstance"
    propagate_at_launch = true
  }
}
  

При применении этой terraform я получаю поставщика мощностей в своем кластере, но экземпляры находятся в кластере default вместо my-cluster . Некоторые скажут, что мне просто нужно добавить

   user_data = <<EOF
    #!/bin/bash
    echo ECS_CLUSTER=${aws_ecs_cluster.my_cluster.name} >> /etc/ecs/ecs.config
  EOF
  

в конфигурацию запуска, но я не могу ссылаться на кластер в конфигурации запуска, потому что кластер зависит от поставщика мощностей, который зависит от группы автоматического масштабирования, которая зависит от конфигурации запуска. Поэтому у меня была бы циклическая зависимость. При этом поддержка поставщика мощностей в terraform кажется совершенно бесполезной, если мы не можем добавить поставщика мощностей после создания кластера.

Ответ №1:

Способ, которым я решаю эту проблему, основан на том факте, что для вашей конфигурации запуска (LC) требуется только знать имя кластера. В настоящее время вы жестко кодируете название кластера в его определении:

 name = "my-cluster"
  

Таким образом, способ, которым я это делаю, заключается в том, чтобы иметь variable с именем:

 variable "cluster_name" {
   default = "my-cluster"
}
  

Теперь вы можете ссылаться на имя в любом месте, где это необходимо, без необходимости фактического создания кластера:

 # The ECS cluster
resource "aws_ecs_cluster" "my_cluster" {
  name = var.cluster_name
  capacity_providers = [aws_ecs_capacity_provider.my_cp.name]
}
  
   user_data = <<EOF
    #!/bin/bash
    echo ECS_CLUSTER=${var.cluster_name} >> /etc/ecs/ecs.config
  EOF
  

Комментарии:

1. Что произойдет, если экземпляры будут созданы до кластера? Например, когда имя кластера не указано user_data , создается кластер с именем default . Я не хочу, чтобы экземпляр создавался my_cluster до того, как это сделает terraform.

2. Экземпляр @Atomiche будет ждать кластера. Как только кластер станет доступным, они будут добавлены. Вы не можете сделать это другим способом, поскольку вы уже указали, что существует циклическая зависимость. Вы должны использовать его, и вы можете сделать это, сначала создав экземпляры.