Terraform中如何从父模块引用特定可用区的路由表输出至子模块
解决方案
提供两种可行方案,可根据是否能修改父模块选择:
方案一:修改父模块输出,提供结构化映射(推荐)
通过调整父模块的输出,将路由表ID与对应可用区关联为键值对,方便子模块直接按AZ取值,更易维护。
- 更新父模块的
outputs.tf,新增结构化输出:
output "private_route_tables_by_az" { value = { for idx, rt in aws_route_table.private : element(var.availability_zones, idx) => rt.id } description = "Private route table IDs mapped by availability zone" }
可保留原private_route_tables_id输出,不影响其他场景使用。
- 子模块中直接通过AZ键获取目标路由表ID:
resource "aws_route" "route" { route_table_id = module.private_subnets.private_route_tables_by_az["us-east-1a"] destination_cidr_block = "6.8.3.3/10" vpc_endpoint_id = "vpce-420495872039" }
方案二:子模块内直接过滤(无需修改父模块)
如果无法修改父模块,可利用Terraform内置函数在子模块中过滤出目标AZ对应的路由表ID:
方法A:通过索引定位
resource "aws_route" "route" { route_table_id = element( module.private_subnets.private_route_tables_id, index(var.availability_zones, "us-east-1a") ) destination_cidr_block = "6.8.3.3/10" vpc_endpoint_id = "vpce-420495872039" }
注意:此方法依赖子模块中var.availability_zones的顺序与父模块完全一致,否则会取错值。
方法B:本地构建映射
locals { rt_by_az = zipmap(var.availability_zones, module.private_subnets.private_route_tables_id) } resource "aws_route" "route" { route_table_id = local.rt_by_az["us-east-1a"] destination_cidr_block = "6.8.3.3/10" vpc_endpoint_id = "vpce-420495872039" }
通过zipmap将可用区列表与路由表ID列表关联为映射,再通过AZ键取值,逻辑更清晰。
内容的提问来源于stack exchange,提问作者mp7
相关产品推荐
相关产品推荐

