Terraform中无法引用for_each创建的Azure LB资源ID问题求助
问题分析与解决方案
错误根源
你当前的代码中,azurerm_lb.lb-test 通过 for_each 生成的集合,键是负载均衡器的名称(比如示例中的"LB1");而 azurerm_lb_backend_address_pool 和 azurerm_lb_probe 的 for_each 键是自身资源的名称(比如"Probe1")。这两个集合的键完全不匹配,直接用 each.key 去引用LB的ID,自然会找不到对应的键值。
解决步骤
1. 调整变量结构
在 variables.tf 中,给 backend_address_pool 和 probe 变量新增 lb_name 字段,用来指定该资源所属的负载均衡器名称:
variable "load_balancers" { type = list(object({ name = string resource_group_name = string location = string sku = string edge_zone = optional(string) sku_tier = optional(string) frontend_ip_configuration = object({ private_ip_address_allocation = string private_ip_address_version = string zones = optional(list(string)) }) })) } variable "backend_address_pool" { type = list(object({ name = string lb_name = string # 新增:关联对应的负载均衡器名称 virtual_network_id = string })) } variable "lb_probes" { type = list(object({ name = string lb_name = string # 新增:关联对应的负载均衡器名称 port = number protocol = string # 其他探针所需字段... })) }
2. 修改资源引用代码
在后端地址池和探针资源中,通过 each.value.lb_name 去匹配对应的负载均衡器ID,而不是用 each.key:
后端地址池调整:
resource "azurerm_lb_backend_address_pool" "bckaddresspool" { for_each = { for pool in var.backend_address_pool : pool.name => pool } name = each.value.name loadbalancer_id = azurerm_lb.lb-test[each.value.lb_name].id virtual_network_id = each.value.virtual_network_id # 建议从变量传入,而非全局var depends_on = [azurerm_lb.lb-test] }
探针资源调整(对应你报错的部分):
resource "azurerm_lb_probe" "azlb_probe" { for_each = { for probe in var.lb_probes : probe.name => probe } name = each.value.name loadbalancer_id = azurerm_lb.lb-test[each.value.lb_name].id port = each.value.port protocol = each.value.protocol # 其他探针配置字段... }
3. 调整tfvars文件
在你的tfvars文件中,给每个后端池和探针指定对应的LB名称:
load_balancers = [ { name = "LB1" resource_group_name = "rg-test" location = "eastus" sku = "Standard" frontend_ip_configuration = { private_ip_address_allocation = "Dynamic" private_ip_address_version = "IPv4" } } ] backend_address_pool = [ { name = "BackendPool1" lb_name = "LB1" # 指定关联的LB名称 virtual_network_id = "/subscriptions/xxx/resourceGroups/rg-test/providers/Microsoft.Network/virtualNetworks/vnet-test" } ] lb_probes = [ { name = "Probe1" lb_name = "LB1" # 指定关联的LB名称 port = 80 protocol = "Http" } ]
关键说明
通过给后端资源(池、探针)添加lb_name关联字段,让每个资源明确知道自己属于哪个LB,这样就能正确匹配到azurerm_lb.lb-test集合中对应的键(LB名称),从而获取到正确的LB ID。
内容的提问来源于stack exchange,提问作者Sarah Potrick
相关产品推荐
相关产品推荐

