Terraform中如何按可用区分组子网并生成指定结构的扁平化列表
解决方案
要将按可用区分组的子网数据转换为你需要的扁平化列表结构,不需要嵌套多层for循环加flatten,直接遍历subnets_by_az的键值对即可:
locals { az_vpn_configs = [ for az_name, subnets in module.defaults.subnets_by_az : { availability_zone = az_name vpc_id = subnets[0].vpc_id subnets = [for s in subnets : s.id] } ] }
代码说明
- 遍历可用区分组:直接迭代
subnets_by_az的键(可用区名称az_name)和值(对应AZ的子网列表subnets) - 提取VPC ID:同一可用区内的子网必然属于同一个VPC,直接取该AZ下第一个子网的
vpc_id即可 - 收集子网ID列表:通过列表推导式,将当前AZ下所有子网的
id提取为一个数组 - 构建目标对象:每个可用区对应一个包含
availability_zone、vpc_id、subnets的对象,最终组成你需要的扁平化列表
结果验证
针对你提供的示例输入,上述代码会生成如下结构(与你的期望结果完全匹配):
[ { "availability_zone" = "us-east-2a" "vpc_id" = "vpc-{some_vpc_id}" "subnets" = ["subnet-{some_id}", "subnet-{some_id}"] }, { "availability_zone" = "us-east-2b" "vpc_id" = "vpc-{some_vpc_id}" "subnets" = ["subnet-{some_id}"] } ]
为什么你的尝试不对
你之前的代码用了两层嵌套for循环加flatten,相当于把每个子网单独拆分为一个对象,而我们需要的是按可用区聚合,只需要外层遍历可用区,内层仅用来收集当前AZ下的子网ID即可,不需要额外的嵌套列表和扁平化操作。
内容的提问来源于stack exchange,提问作者AlexLordThorsen
相关产品推荐
相关产品推荐

