You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]
    }
  ]
}

代码说明

  1. 遍历可用区分组:直接迭代subnets_by_az的键(可用区名称az_name)和值(对应AZ的子网列表subnets)
  2. 提取VPC ID:同一可用区内的子网必然属于同一个VPC,直接取该AZ下第一个子网的vpc_id即可
  3. 收集子网ID列表:通过列表推导式,将当前AZ下所有子网的id提取为一个数组
  4. 构建目标对象:每个可用区对应一个包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:33:26