如何在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
相关产品推荐
相关产品推荐

