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

如何在Terraform Azure中用for_each循环创建多私有DNS区域及虚拟网络链接

解决方案:为每个私有DNS区域创建多个虚拟网络链接

要实现每个私有DNS区域关联多个虚拟网络链接,核心是将DNS区域与对应的虚拟网络ID组合成唯一的键值对集合,让Terraform的for_each能遍历每个独立的链接实例。以下是完整的修正代码:

variable "privateDnsZones" {
  type = map(object({
    virtualNetworksID = list(string)
  }))
  default = {
    "privatelink.monitor.azure.com" = {
      virtualNetworksID = [
        "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnet1",
        "/subscriptions/xxx/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/vnet2"
      ]
    },
    "privatelink.oms.opinsights.azure.com" = {
      virtualNetworksID = [
        "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.Network/virtualNetworks/vnet1",
        "/subscriptions/xxx/resourceGroups/rg3/providers/Microsoft.Network/virtualNetworks/vnet3"
      ]
    }
  }
}

resource "azurerm_private_dns_zone" "privateDnsZone" {
  for_each            = var.privateDnsZones
  name                = each.key
  resource_group_name = data.azurerm_resource_group.existing_RG.name
  tags                = var.resource_tags
}

resource "azurerm_private_dns_zone_virtual_network_link" "privateDnsZone_link" {
  # 生成扁平的映射,每个键对应一个DNS区域+VNet的组合
  for_each = tomap({
    for item in flatten([
      for dns_zone_name, dns_zone in var.privateDnsZones : [
        for vnet_id in dns_zone.virtualNetworksID : {
          # 用DNS区域名+替换特殊字符后的VNet ID作为唯一键
          key           = "${dns_zone_name}-${replace(vnet_id, "/", "_")}"
          dns_zone_name = dns_zone_name
          vnet_id       = vnet_id
        }
      ]
    ]) : item.key => item
  })

  name                  = each.value.key
  resource_group_name   = data.azurerm_resource_group.existing_RG.name
  private_dns_zone_name = azurerm_private_dns_zone.privateDnsZone[each.value.dns_zone_name].name
  virtual_network_id    = each.value.vnet_id
}

关键要点说明:

  • 扁平化映射生成:通过嵌套for表达式遍历每个DNS区域及其关联的VNet ID列表,再用flatten将嵌套结构转为一维列表,最后用tomap转为for_each可接受的映射类型。
  • 唯一键生成:将DNS区域名与替换了/(Terraform不允许键包含/)的VNet ID拼接,确保每个链接实例的键唯一。
  • 字段关联:通过each.value获取对应DNS区域名和VNet ID,关联到已创建的私有DNS区域资源。

注意:请将变量virtualNetworksID中的空字符串替换为实际的虚拟网络资源ID,否则会创建无效的链接实例。

内容的提问来源于stack exchange,提问作者Mr.cool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:22:53