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 (которая возвращает только значения ассоциативного массива) и символ *: