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 можно использовать ссылки
Соберем все это вместе и динамически сгенерируем блоки 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, план действий будет выглядеть примерно так: