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

如何通过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块中重复定义相同参数,每个路由对应一个独立的资源实例才是正确写法)。

  1. 生成所有组合的本地值
    通过三层嵌套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
  }
}
  1. 创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:23:22