如何从Terraform的eks_private_subnets_in_zones结构提取指定子网列表?
Terraform提取各可用区首个子网的解决方案
问题场景
你的Terraform输出存在如下结构:
"eks_private_subnets_in_zones": { "value": { "us-east-1a": [ "subnet-11111111111111111", "subnet-22222222222222222" ], "us-east-1b": [ "subnet-33333333333333333", "subnet-44444444444444444" ], "us-east-1c": [ "subnet-55555555555555555", "subnet-66666666666666666" ] } }
需要生成一个包含每个可用区(AZ)中第一个子网的列表,期望结果如下:
["subnet-11111111111111111", "subnet-33333333333333333", "subnet-55555555555555555"]
你尝试过以下代码,但未得到预期结果:
{for az in eks_private_subnets_in_zones: subnet.id => az[0]}
解决方案
你需要调整for表达式的写法,因为当前输出是嵌套对象,且你需要的是列表而非映射,正确写法如下:
基础写法:直接提取生成列表
[for az_subnets in eks_private_subnets_in_zones.value : az_subnets[0]]
代码解释
eks_private_subnets_in_zones.value:先定位到可用区与子网映射的顶层对象for az_subnets in ...:遍历每个可用区对应的子网列表az_subnets[0]:取出每个子网列表的第一个元素- 外层用
[]包裹,最终生成符合需求的列表类型结果
进阶写法:保证子网顺序一致
Terraform遍历映射时默认无序,若需要列表中子网顺序和可用区名称排序一致,可结合sort函数:
[for az in sort(keys(eks_private_subnets_in_zones.value)) : eks_private_subnets_in_zones.value[az][0]]
该写法会先对可用区名称排序(如us-east-1a→us-east-1b→us-east-1c),再按此顺序提取首个子网,避免列表顺序随机变化。
内容的提问来源于stack exchange,提问作者Jason Michael
相关产品推荐
相关产品推荐

