Как получить доступ к списку списков, в котором есть карта, с помощью Terraform 0.11? - PullRequest
1 голос
/ 27 мая 2020

У меня есть несколько групп узлов EKS . Я пытаюсь получить доступ к autoscaling_groups name всех групп узлов (например, name = eks-e214c586716a). В 0.12 все намного проще, но мы все еще используем 0.11.

[
  [
    {
      "autoscaling_groups" = [
        {
          "name" = "eks-e214c586716a"
        },
      ]
      "remote_access_security_group_id" = "sg-name1"
    },
  ],
  [
    {
      "autoscaling_groups" = [
        {
          "name" = "eks-c866f3f2edb5"
        },
      ]
      "remote_access_security_group_id" = "sg-name2"
    },
  ],
]

Это работает: aws_eks_node_group.node-group.resources.0.autoscaling_groups.0.name

Однако, когда я повторяю, мне не удается.

count = "${length(var.nodegroups)}"
autoscaling_group_name    = "${element(aws_eks_node_group.node-group.resources.*.autoscaling_groups.*.name, count.index)}"

1 Ответ

2 голосов
/ 27 мая 2020

Похоже, вы неправильно читаете сложную структуру данных, которая у вас есть.

У вас есть список групп узлов, который, в свою очередь, содержит другой список, в котором всегда есть один элемент, который является объектом с ключами autoscaling_groups и remote_access_security_group_id. Ключ autoscaling_groups также является еще одним списком с одним элементом, который содержит объект с ключом name.

Ваша попытка сделать это заключалась в использовании:

"${element(aws_eks_node_group.node-group.resources.*.autoscaling_groups.*.name, count.index)}"

Что является сказать l oop по внешнему списку, а затем попытаться получить ключ autoscaling_groups от объекта там, когда в этот момент это список с 1 элементом в нем. Затем вы также попытались l oop по внутреннему самому списку, в котором есть только один элемент, поэтому вы бы переиндексировали, если бы вы выбрали:

"${element(aws_eks_node_group.node-group.resources.*.*.autoscaling_groups.*.name, count.index)}"

Потому что element позволяет обернуть вокруг, вы не получите здесь выход за пределы индекса при попытке доступа ко второму элементу списка из 1 элемента, однако Terraform не позволяет вам использовать вложенные выражения splat:

Error: Nested splat expression not allowed

  on main.tf line 33, in resource "local_file" "asg_names":
  33:   content  = "${element(local.eks_node_group.*.*.autoscaling_groups.*.name, count.index)}"

A splat expression (*) cannot be used inside another attribute-only splat
expression.

Итак, чтобы получить имена групп автомасштабирования, которые вы хотите l oop поверх самого внешнего списка, а затем взять первый элемент этого списка, получить ключ autoscaling_groups, взять первый элемент этого списка, а затем, наконец, получить значение из name ключ.

Вот базовый c рабочий пример доступа к этой структуре данных, используя локальные переменные для ввода и ресурс local_file в качестве вывода, чтобы позволить нам l oop поверх него с count:

locals {
  eks_node_group = [
    [
      {
        "autoscaling_groups" = [
          {
            "name" = "eks-e214c586716a"
          },
        ]
        "remote_access_security_group_id" = "sg-name1"
      },
    ],
    [
      {
        "autoscaling_groups" = [
          {
            "name" = "eks-c866f3f2edb5"
          },
        ]
        "remote_access_security_group_id" = "sg-name2"
      },
    ],
  ]
}

resource "local_file" "asg_names" {
  count    = "${length(local.eks_node_group)}"
  filename = "${count.index}.output"
  content  = "${element(local.eks_node_group.*.0.autoscaling_groups.0.name, count.index)}"
}

Запуск плана показывает следующий ожидаемый результат:

  # local_file.asg_names[0] will be created
  + resource "local_file" "asg_names" {
      + content              = "eks-e214c586716a"
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "0.output"
      + id                   = (known after apply)
    }

  # local_file.asg_names[1] will be created
  + resource "local_file" "asg_names" {
      + content              = "eks-c866f3f2edb5"
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "1.output"
      + id                   = (known after apply)
    }

Обратите внимание, что, если вы не хотите, чтобы функция element как упоминалось выше, обернулась вокруг, вам следует Я должен использовать более простой синтаксис индексации, например list[index]:

resource "local_file" "asg_names" {
  count    = "${length(local.eks_node_group)}"
  filename = "${count.index}.output"
  content  = "${local.eks_node_group[count.index].0.autoscaling_groups.0.name}"
}
...