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

Azure中Terraform部署函数与存储私有网络通信问题求助

问题描述

在Azure环境中通过Web UI搭建Azure Function与存储账户的私有虚拟网络通信,已成功创建Private Endpoint、关联子网、配置正确FQDN的私有DNS服务器,实现了二者正常通信。
使用Terraform复现该架构时,已成功创建私有DNS区域、VNet子网、存储账户及Azure Function,但Function与存储账户无法通信。对比Web UI和Terraform生成的资源,发现缺少Private Link与IP绑定的自定义DNS记录,相关Terraform代码如下:

私有DNS区域及VNet关联代码

resource "azurerm_private_dns_zone" "private_dns_zone" {
  name                = "sample1114.com"
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_private_dns_zone_virtual_network_link" "private_dns_zone_virtual_network_link" {
  name                  = "sample1114-vnet-link"
  resource_group_name   = azurerm_resource_group.rg.name
  private_dns_zone_name = azurerm_private_dns_zone.private_dns_zone.name
  virtual_network_id    = azurerm_virtual_network.vnet.id
  registration_enabled  = false
}

存储账户私有端点及DNS记录代码

resource "azurerm_private_endpoint" "storage_endpoint_table" {
  name                = azurerm_storage_account.tablestorageaccount.name
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  subnet_id           = azurerm_subnet.subnetstorage.id
  private_service_connection {
    name                           = azurerm_storage_account.tablestorageaccount.name
    is_manual_connection           = false
    private_connection_resource_id = azurerm_storage_account.tablestorageaccount.id
    subresource_names              = ["table"]
  }
}


resource "azurerm_private_dns_a_record" "storage_endpoint_table" {
  name                = azurerm_storage_account.tablestorageaccount.name
  zone_name           = azurerm_private_dns_zone.private_dns_zone.name
  resource_group_name = azurerm_resource_group.rg.name
  ttl                 = 300
  records             = [azurerm_private_endpoint.storage_endpoint_table.private_service_connection[0].private_ip_address]
}
问题分析与解决方案

问题核心在于自定义DNS区域与存储账户默认FQDN不匹配,导致Function无法通过正确的DNS解析找到私有端点IP。

1. 使用Azure存储服务专用的私有DNS区域

Azure存储账户的默认FQDN格式为{storage-account-name}.{service-type}.core.windows.net,对应私有DNS区域需使用Azure官方定义的专用区域:

  • Table服务:privatelink.table.core.windows.net
  • Blob服务:privatelink.blob.core.windows.net
  • Queue服务:privatelink.queue.core.windows.net
  • File服务:privatelink.file.core.windows.net

替换原自定义DNS区域资源:

resource "azurerm_private_dns_zone" "storage_table_private_dns" {
  name                = "privatelink.table.core.windows.net"
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_private_dns_zone_virtual_network_link" "storage_table_dns_link" {
  name                  = "storage-table-dns-vnet-link"
  resource_group_name   = azurerm_resource_group.rg.name
  private_dns_zone_name = azurerm_private_dns_zone.storage_table_private_dns.name
  virtual_network_id    = azurerm_virtual_network.vnet.id
  registration_enabled  = false
}

2. 修正DNS A记录关联的区域

确保A记录创建在对应服务的私有DNS区域下,这样Function访问存储账户默认FQDN时,会被解析到私有端点IP:

resource "azurerm_private_dns_a_record" "storage_endpoint_table" {
  name                = azurerm_storage_account.tablestorageaccount.name
  zone_name           = azurerm_private_dns_zone.storage_table_private_dns.name
  resource_group_name = azurerm_resource_group.rg.name
  ttl                 = 300
  records             = [azurerm_private_endpoint.storage_endpoint_table.private_service_connection[0].private_ip_address]
}

3. 确保Azure Function使用VNet的DNS配置

需将Azure Function配置为加入目标VNet(与私有端点同子网或关联VNet的子网):

  • 消费计划:开启VNet集成功能
  • 专用计划:直接部署在VNet子网内
    确保Function的DNS查询能继承VNet的私有DNS区域解析能力。

补充说明

如果存储账户同时使用多种服务(如Blob+Table),需为每个服务创建对应的私有DNS区域、私有端点及A记录。

内容的提问来源于stack exchange,提问作者Scott S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:52:40