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
相关产品推荐
相关产品推荐

