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

Terraform中azurerm_route资源循环遍历路由列表的问题

解决Terraform azurerm_route循环遍历路由集合的问题

错误原因分析

你当前的报错主要有两个问题:

  1. map索引的冗余插值:var.route_table["${var.rtLab1}"]里的${}是多余的,直接用var.route_table[var.rtLab1]即可访问目标路由表的配置。
  2. for_each键类型非法:你用route => idx,其中route是对象类型,Terraform要求for_each的键必须是字符串、数字或布尔值,不能用对象作为键,这是核心报错原因。

正确实现方式

首先确保你的变量定义符合结构要求(以variables.tf为例):

variable "route_table" {
  type = map(object({
    routes = list(object({
      name                   = string
      address_prefix         = string
      next_hop_type          = string
      next_hop_in_ip_address = optional(string) # 可选字段,按需添加
    }))
  }))
  description = "存储路由表及其关联路由的映射"
}

variable "rtLab1" {
  type        = string
  description = "目标实验室路由表的名称"
}

然后在main.tf的azurerm_route资源块中,使用唯一字符串作为for_each的键,推荐用路由名称+地址前缀组合(确保绝对唯一),代码如下:

resource "azurerm_route" "lab-rt1-routes" {
  for_each = {
    for route in var.route_table[var.rtLab1].routes : 
    "${route.name}-${route.address_prefix}" => route
  }

  name                   = each.value.name
  resource_group_name    = "your-resource-group" # 替换为实际资源组名或变量
  route_table_name       = var.rtLab1
  address_prefix         = each.value.address_prefix
  next_hop_type          = each.value.next_hop_type
  next_hop_in_ip_address = each.value.next_hop_in_ip_address
}

简化写法(如果路由名称在路由表内唯一)

如果能保证同一个路由表下的路由名称不会重复,也可以直接用路由名称作为键:

for_each = {for route in var.route_table[var.rtLab1].routes : route.name => route}

这种写法会自动根据var.route_table[var.rtLab1].routes的增删动态创建/销毁路由,完全满足你动态迭代的需求。

内容的提问来源于stack exchange,提问作者NickP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:37:15