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

Terraform AWS:如何按可用区(AZ)输出子网?

问题:按可用区(AZ)格式化公网子网输出

我已经成功实现按AZ输出路由表,格式如下:

private_route_tables = {
  "us-west-2a" = "rtb-0443231b6########"
  "us-west-2b" = "rtb-05a1de447########"
  "us-west-2c" = "rtb-0e8e68db6########"
}

但当前公网子网的输出是嵌套列表格式,包含一个空条目(us-west-2区域共4个AZ,我仅需使用其中3个):

public_subnet_ids_per_az = [
  tolist([
    "subnet-0159b3273########",
    "subnet-06e6f50e1########",
  ]),
  tolist([
    "subnet-030d84387########",
    "subnet-04a46deb6########",
  ]),
  tolist([
    "subnet-086f2527f########",
    "subnet-06649e7ef########",
  ]),
  tolist([]),
]

我期望的输出格式是按AZ作为键的映射,仅包含有子网的3个AZ:

public_subnet_ids_per_az = {
   "us-west-2a" =  ["subnet-0159b3273########", "subnet-06e6f50e1########"]
   "us-west-2b" =  ["subnet-030d84387########", "subnet-04a46deb6########"]
   "us-west-2c" =  ["subnet-086f2527f########", "subnet-06649e7ef########"]
}

解决方案

方法1:基于现有子网列表转换

假设你已经定义了包含目标AZ的变量var.azs = ["us-west-2a", "us-west-2b", "us-west-2c"],在outputs.tf中使用for表达式将列表转换为映射,并过滤空条目:

output "public_subnet_ids_per_az" {
  value = tomap({
    for idx, az in var.azs : az => public_subnet_ids_per_az[idx] if length(public_subnet_ids_per_az[idx]) > 0
  })
}

方法2:直接从子网资源分组(更推荐)

如果公网子网是通过aws_subnet资源创建的(例如aws_subnet.public),可以直接利用Terraform的分组操作符...按可用区聚合子网ID:

output "public_subnet_ids_per_az" {
  value = tomap({
    for subnet in aws_subnet.public : subnet.availability_zone => subnet.id...
  })
}

说明

  • 方法2会自动按每个AZ分组子网ID,无需手动处理列表索引,同时只会包含有子网存在的AZ,自然排除空条目。
  • 确保你的子网资源只在var.azs指定的3个AZ中创建,避免生成不需要的子网条目。

内容的提问来源于stack exchange,提问作者user20208419

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:34