Terraform如何遍历多CIDR为每个路由表批量创建aws_route资源
Terraform 多路由表+多CIDR批量创建路由实现方案
你需要通过setproduct函数对路由表ID列表和CIDR列表求笛卡尔积,生成所有路由表+CIDR的组合,再将组合转换为for_each支持的map结构即可实现需求,具体步骤如下:
步骤1:调整变量定义
首先把tgw_destination_cidr_block变量的类型调整为字符串列表,示例:
variable "tgw_destination_cidr_block" { type = list(string) description = "List of destination CIDR blocks for TGW routes" default = [] }
步骤2:重写aws_route资源逻辑
使用setproduct生成所有组合,再转换为带唯一键的map供for_each使用:
resource "aws_route" "private_route" { # 生成 路由表ID * CIDR 的所有组合,转换为唯一键的map for_each = { for combo in setproduct(data.aws_route_tables.private_route_tables.ids, var.tgw_destination_cidr_block) : "${combo[0]}_${replace(combo[1], "/", "_")}" => { route_table_id = combo[0] destination_cidr_block = combo[1] } } route_table_id = each.value.route_table_id destination_cidr_block = each.value.destination_cidr_block transit_gateway_id = module.tgw.ec2_transit_gateway_id }
逻辑说明
setproduct(A, B)会返回两个列表的笛卡尔积,比如路由表有2个、CIDR有2个时,会生成4个组合:[rtb-xxx1, cidr1]、[rtb-xxx1, cidr2]、[rtb-xxx2, cidr1]、[rtb-xxx2, cidr2]- 生成的键采用
路由表ID_替换了/的CIDR格式,保证每个资源实例的键唯一且稳定,新增/删除路由表或CIDR时不会触发无关资源的重建 - 每个实例会自动取对应组合的路由表ID和CIDR创建路由,完全匹配需求
内容的提问来源于stack exchange,提问作者Miroslav
相关产品推荐
相关产品推荐

