Terraform: инфраструктура на уровне кода | страница 104
resource "
for_each =
[CONFIG ...]
}
PROVIDER — это имя провайдера (например, aws), TYPE — тип ресурса, который нужно создать в этом провайдере (скажем, instance), NAME — идентификатор, с помощью которого можно ссылаться на ресурс на разных участках кода Terraform (вроде my_instance), COLLECTION — множество или ассоциативный массив, который нужно перебрать в цикле (при использовании for_each в сочетании с ресурсом списки не поддерживаются), а CONFIG состоит из одного или нескольких аргументов, предназначенных специально для этого ресурса. Внутри CONFIG можно применять ссылки each.key и each.value для доступа к ключу и значению текущего элемента COLLECTION.
Например, так можно создать тех же трех пользователей IAM с помощью for_each:
resource "aws_iam_user" "example" {
for_each = toset(var.user_names)
name = each.value
}
Обратите внимание на функцию toset, которая превращает список var.user_names во множество. Дело в том, что выражение for_each поддерживает множества и ассоциативные массивы только для ресурсов. При переборе этого множества оно предоставляет имя каждого пользователя в виде each.value. То же самое значение будет доступно и в each.key, хотя эта ссылка обычно используется только в ассоциативных массивах с ключами и значениями.
Ресурс, к которому применяется for_each, становится ассоциативным массивом ресурсов (а не обычным массивом, как в случае с count). Чтобы это продемонстрировать, заменим оригинальные выходные переменные all_arns и neo_arn новой, all_users:
output "all_users" {
value = aws_iam_user.example
}
Вот что произойдет, если выполнить terraformapply:
$ terraform apply
(...)
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Outputs:
all_users = {
"morpheus" = {
"arn" = "arn:aws:iam::123456789012:user/morpheus"
"force_destroy" = false
"id" = "morpheus"
"name" = "morpheus"
"path" = "/"
"tags" = {}
}
"neo" = {
"arn" = "arn:aws:iam::123456789012:user/neo"
"force_destroy" = false
"id" = "neo"
"name" = "neo"
"path" = "/"
"tags" = {}
}
"trinity" = {
"arn" = "arn:aws:iam::123456789012:user/trinity"
"force_destroy" = false
"id" = "trinity"
"name" = "trinity"
"path" = "/"
"tags" = {}
}
}
Как видите, Terraform создает трех пользователей IAM, а выходная переменная all_users содержит ассоциативный массив, ключи которого (в данном случае имена пользователей) используются в for_each, а значения служат выходными переменными этого ресурса. Если хотите вернуть выходную переменную all_arns, нужно приложить дополнительные усилия, чтобы извлечь соответствующие ARN, добавив встроенную функцию values (которая возвращает только значения ассоциативного массива) и символ *: