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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:25:01