Terraform中azurerm_route资源循环遍历路由列表的问题
解决Terraform azurerm_route循环遍历路由集合的问题
错误原因分析
你当前的报错主要有两个问题:
- map索引的冗余插值:
var.route_table["${var.rtLab1}"]里的${}是多余的,直接用var.route_table[var.rtLab1]即可访问目标路由表的配置。 - 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
相关产品推荐
相关产品推荐

