Terraform: не может обеспечить кластер aws ecs для автоматического масштабирования - PullRequest
1 голос
/ 17 апреля 2020

Мы используем Terraform для предоставления AWS Группы автоматического масштабирования и кластера ECS. Мы решили добавить провайдера емкости в кластер ECS и позволить ему управлять нашим масштабированием в соответствии с https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-auto-scaling.html

Но когда мы добавили ресурс провайдера емкости и подключили его к кластеру через атрибут capacity_providers на ресурсе кластера, terraform plan начал жаловаться на "Cylce". Я не уверен, как еще настроить это - кажется, что каждое «соединение» между ресурсами настроено правильно, и все же кажется, что terraform не может обеспечить это:

resource "aws_ecs_cluster" "cluster" {
  name               = "${var.environment}_cluster"
  capacity_providers = [aws_ecs_capacity_provider.capacity_provider.name]
}

resource "aws_ecs_capacity_provider" "capacity_provider" {
  name = "${var.environment}_capacity_provider"

  auto_scaling_group_provider {
    auto_scaling_group_arn = aws_autoscaling_group.autoscaling_group.arn
    managed_termination_protection = "ENABLED"

    managed_scaling {
      maximum_scaling_step_size = 1
      minimum_scaling_step_size = 1
      status                    = "ENABLED"
      target_capacity           = 100
    }
  }
}

resource "aws_launch_configuration" "launch_configuration" {
  name_prefix                 = "${var.environment}_launch_configuration-"
  image_id                    = data.aws_ami.ecs_os.id
  instance_type               = var.cluster_instance_type
  iam_instance_profile        = var.ecs_instance_profile
  security_groups             = var.security_groups["ecs_tasks"]
  associate_public_ip_address = true
  key_name                    = aws_key_pair.ssh_access.key_name
  user_data                   = data.template_file.launch_user_data.rendered

  lifecycle {
    create_before_destroy = true
  }
}

data "template_file" "launch_user_data" {
  template = "${file("${path.module}/taskdefs/user_data")}"

  vars = {
    ecs_cluster = aws_ecs_cluster.cluster.name
    efs_id      = var.efs_id
    aws_region  = data.aws_region.current.name
  }
}

resource "aws_autoscaling_group" "autoscaling_group" {
  name                  = "${var.environment}_asg"
  max_size              = 4
  min_size              = 1
  vpc_zone_identifier   = [var.public_subnet_id]
  launch_configuration  = aws_launch_configuration.launch_configuration.name
  health_check_type     = "EC2"
  protect_from_scale_in = true
}

terraform plan output:

Error: Cycle: module.compute.aws_ecs_cluster.cluster, module.compute.data.template_file.launch_user_data, module.compute.aws_launch_configuration.launch_configuration, module.compute.aws_autoscaling_group.autoscaling_group, module.compute.aws_ecs_capacity_provider.capacity_provider

Редактировать: пояснить: я понимаю, что на самом деле существует цикл. Мой вопрос: как можно обеспечить терраформную передачу без цикла? Я не вижу, как это возможно.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Я тоже заметил это раньше, но в итоге не использовал провайдеров емкости.

Если вы go в веб-консоли AWS ECS, кажется, единственное место, где вы можете создать провайдера мощности вручную, это ВНУТРИ СУЩЕСТВУЮЩЕГО КЛАСТЕРА. Кажется, это не отдельный ресурс внутри AWS, а подресурс кластера. Я думаю, что это настоящая проблема "курицы с яйцом".

Я думаю, что должен быть способ, чтобы terraform создал кластер (без поставщика емкости), ТО затем создал поставщика мощности, а затем, наконец, назначьте это кластеру. Пахнет отчетом об ошибке.

0 голосов
/ 18 апреля 2020

Сначала вы можете определить имя кластера следующим образом.

locals {
  cluster_name = "${var.environment}_cluster"
}              

А затем

resource "aws_ecs_cluster" "cluster" {
  name               = local.cluster_name
  capacity_providers = [aws_ecs_capacity_provider.capacity_provider.name]
}

data "template_file" "launch_user_data" {
  template = "${file("${path.module}/taskdefs/user_data")}"

  vars = {
    ecs_cluster = local.cluster_name
    efs_id      = var.efs_id
    aws_region  = data.aws_region.current.name
  }
}

Это позволит избежать цикла.

I надеюсь, это поможет.

...