Что является ключом в карте сложного типа данных (объект) - PullRequest
0 голосов
/ 28 марта 2020

Я новичок в terraform и пытаюсь понять приведенный ниже фрагмент кода. Переменная имеет тип карты (объекты) и ее циклическое отображение на карте (объекты) и функция ключей берет карту и возвращает список, содержащий ключи от этой карты. Пример: https://www.terraform.io/docs/configuration/functions/keys.html

Я считаю, что результат будет примерно таким:

network_ids = {
  network_alias = 123
  network_alias = 456
  network_alias = 789
}

Какое значение будет иметь значение network_alias? Я перебрал много ссылок, но не могу понять.

code snippet:

locals {
  network_ids = {
    for network_alias in keys(var.networks) :
    network_alias => aws_vpc.subnet[network_alias].id
  }
}

variable "networks" {
  type = map(object({
    network_number    = string
    availability_zone = string
  }))
}

1 Ответ

1 голос
/ 28 марта 2020

Я рад это разобрать.

Итак, для начала, network_ids - это локальное значение terraform . Обычно локальные значения используются для хранения вычислений, которые вы не хотите повторять снова и снова.

network_ids, в частности, map for выражение . map for выражения используются для создания map s из других «перечислимых» значений.

В терраформе map походит на HashMap в других языках (dict в python, Hash в ruby, HashMap в Java и т. Д.). map содержит список ассоциаций, отображающий уникальный ключ (всегда string) на значение, которое может иметь любой, непротиворечивый тип (то есть, вы не можете иметь такие вещи, как { "a" = 4, "b" = "c" }, поскольку 4 и "c" имеют различные типы).

В вашем примере c, for network_alias in keys(var.networks) говорит, в основном

l oop через клавиши (опять же, string s) в var.networks и свяжите каждого с именем network_alias.

В части network_alias => aws_vpc.subnet[network_alias].id написано

создайте новую карту, где ключ совпадает с ключами мы зациклились, и значение - это поиск идентификатора su bnet, индексированного по ключу.

При всем этом local.network_ids не будет выглядеть как ниже, потому что map s имеют разные ключи, и понимание на самом деле оценивает значение ключа

network_ids = {
  network_alias = 123
  network_alias = 456
  network_alias = 789
}

Невозможно точно сказать, каким будет значение, потому что я не знаю значение var.networks или aws_vpc.subnet.

...