Terraform: инфраструктура на уровне кода | страница 106



Итак, вы указали свои теги. Но как назначить их ресурсу aws_autoscaling_group? Для этого нужно циклически перебрать var.custom_tags. Пример этого показан в следующем псевдокоде:

resource "aws_autoscaling_group" "example" {

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = data.aws_subnet_ids.default.ids

  target_group_arns    = [aws_lb_target_group.asg.arn]

  health_check_type    = "ELB"

  min_size = var.min_size

  max_size = var.max_size

  tag {

    key                 = "Name"

    value               = var.cluster_name

    propagate_at_launch = true

  }

  # Это просто псевдокод. Он не будет работать в Terraform.

  for (tag in var.custom_tags) {

    tag {

      key                 = tag.key

      value               = tag.value

      propagate_at_launch = true

    }

  }

}

Псевдокод, приведенный выше, работать не будет. Вместо него мы воспользуемся выражением for_each. Так выглядит синтаксис динамической генерации вложенных блоков:

dynamic "" {

  for_each =

  content {

     [CONFIG...]

  }

}

VAR_NAME — имя переменной, которая будет хранить значение каждой итерации (вместо each), COLLECTION — список или ассоциативный массив, который нужно перебрать, а блок content — это то, что генерируется при каждом проходе. Внутри блока content можно использовать ссылки .key и .value для доступа к ключу и соответственно к значению текущего элемента COLLECTION. Стоит отметить, что, когда вы применяете for_each в сочетании со списком, key содержит индекс, value — элемент с этим индексом. В случае с ассоциативным массивом key и value представляют собой одну из его пар типа «ключ — значение».

Соберем все это вместе и динамически сгенерируем блоки tag в ресурсе aws_autoscaling_group с помощью for_each:

resource "aws_autoscaling_group" "example" {

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = data.aws_subnet_ids.default.ids

  target_group_arns    = [aws_lb_target_group.asg.arn]

  health_check_type    = "ELB"

  min_size = var.min_size

  max_size = var.max_size

  tag {

    key                 = "Name"

    value               = var.cluster_name

    propagate_at_launch = true

  }

  dynamic "tag" {

    for_each = var.custom_tags

    content {

      key                 = tag.key

      value               = tag.value

      propagate_at_launch = true

    }

  }

}

Теперь, если выполнить terraformapply, план действий будет выглядеть примерно так: