Похоже, вы неправильно читаете сложную структуру данных, которая у вас есть.
У вас есть список групп узлов, который, в свою очередь, содержит другой список, в котором всегда есть один элемент, который является объектом с ключами 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}"
}