如何通过Terraform基于复杂对象遍历创建AWS Route资源?
实现Terraform多组合生成aws_route资源
给定如下复杂结构的变量Test_route,需要基于路由表ID、目标CIDR块、NAT网关ID的所有笛卡尔积组合,生成对应的aws_route资源:
variable "Test_route" { type = map(object({ Destination = list(string) Nat_id = list(string) })) default = { Route_table_id_1 = { Destination = ["10.0.0.0", "10.1.0.0"] Nat_id = ["abd", "sky"] } Route_table_id_2 = { Destination = ["10.0.0.0", "10.1.0.0", "0.0.0.0/0"] Nat_id = ["abd", "sky"] } } }
实现方案
核心思路是通过嵌套循环生成三者的所有组合,再利用for_each遍历这些组合创建独立的资源实例(注意:Terraform不支持在单个resource块中重复定义相同参数,每个路由对应一个独立的资源实例才是正确写法)。
- 生成所有组合的本地值
通过三层嵌套for循环生成笛卡尔积,再用flatten将嵌套列表转为一维结构,最后为每个组合生成唯一标识键:
locals { # 生成路由表、目标CIDR、NAT网关的所有组合 route_combinations = flatten([ for route_table_id, config in var.Test_route : [ for dest in config.Destination : [ for nat in config.Nat_id : { route_table_id = route_table_id destination = dest nat_gateway_id = nat } ] ] ]) # 为每个组合生成唯一键,用于for_each route_combination_keys = { for combo in local.route_combinations : "${combo.route_table_id}-${combo.destination}-${combo.nat_gateway_id}" => combo } }
- 创建aws_route资源
使用for_each遍历上述生成的组合键值对,每个组合对应一个独立的路由资源:
resource "aws_route" "private_subnet_route_to_nat_gw" { for_each = local.route_combination_keys route_table_id = each.value.route_table_id destination_cidr_block = each.value.destination nat_gateway_id = each.value.nat_gateway_id }
效果说明
执行上述代码后,Terraform会自动创建所有预期的路由资源,每个路由实例的唯一标识由路由表ID-目标CIDR-NAT网关ID拼接而成,确保资源的唯一性和可追踪性。
内容的提问来源于stack exchange,提问作者Nishchal Dinesh
相关产品推荐
相关产品推荐

