我有几个 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)}"
看起来你误读了那里的复杂数据结构。
您有一个节点组列表,而节点组又包含另一个列表,该列表始终具有一个元素,该元素是具有键autoscaling_groups
和remote_access_security_group_id
的对象。然后,autoscaling_groups
键也是另一个列表,其中包含一个元素,该元素包含一个键name
的对象。
您尝试这样做是使用:
"${element(aws_eks_node_group.node-group.resources.*.autoscaling_groups.*.name, count.index)}"
也就是说,循环访问最外层的列表,然后尝试从那里的对象获取autoscaling_groups
键,此时它是一个包含 1 个元素的列表。然后,您还尝试遍历最内部的列表,该列表只有一个元素,因此如果您使用:
"${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.
因此,若要获取自动缩放组名称,要遍历最外层的列表,然后获取该列表的第一个元素,获取autoscaling_groups
键,获取该列表的第一个元素,最后从name
键获取值。
下面是访问此数据结构的基本工作示例,使用局部变量作为输入,使用local_file
资源作为输出,以允许我们使用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}"
}