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

