Terraform部署Azure Private Link访问存储账户故障排查
Azure Private Endpoint 部署故障排查思路(Terraform)
场景说明
我需要测试以下场景:
- 拥有包含两个子网(
vm_subnet和storage_account_subnet)的虚拟网络 - 虚拟机(VM)通过 Private Link 连接至存储账户
测试步骤:
- 使用 SSH/Putty,以用户名
adminuser、密码P@$$w0rd1234!连接 Azure 虚拟机 - 在终端执行
ping formuleinsstorage.blob.core.windows.net,期望返回storage_account_subnet(10.0.2.0/24)范围内的 IP
问题:通过 Terraform v1.2.5(windows_386)+ azurerm provider v3.30.0 部署全部基础设施后,Private Endpoint 无法正常工作;手动添加服务端点则一切正常,怀疑 Private Link 配置存在问题。
排查思路
1. 检查 Private Endpoint 所在子网的网络策略
- 确认
storage_account_subnet的privateEndpointNetworkPolicies参数已设为Disabled(Terraform 中对应azurerm_subnet资源的private_endpoint_network_policies),默认值为Enabled,会阻止 Private Endpoint 生效。
示例配置:resource "azurerm_subnet" "storage_account_subnet" { name = "storage_account_subnet" resource_group_name = azurerm_resource_group.example.name virtual_network_name = azurerm_virtual_network.example.name address_prefixes = ["10.0.2.0/24"] private_endpoint_network_policies = "Disabled" } - 核对子网是否关联到目标虚拟网络,避免 ID 或名称拼写错误。
2. 验证 Private Endpoint 与存储账户的关联配置
- 检查
azurerm_private_endpoint资源中,private_service_connection块的private_connection_resource_id是否指向正确的存储账户 ID,确认存储账户名称无误。 - 确保
group_ids设置为["blob"],因为要连接存储账户的 Blob 服务,参数错误会导致关联服务不匹配。 - 确认
is_manual_connection设为false(自动批准),若为true需手动在存储账户控制台批准连接,否则端点无法激活。
示例配置:resource "azurerm_private_endpoint" "example" { name = "example-pe" resource_group_name = azurerm_resource_group.example.name location = azurerm_resource_group.example.location subnet_id = azurerm_subnet.storage_account_subnet.id private_service_connection { name = "example-psc" private_connection_resource_id = azurerm_storage_account.example.id is_manual_connection = false group_ids = ["blob"] } }
3. 检查 Private DNS Zone 配置
- 确认已创建对应 Blob 服务的 Private DNS Zone(
privatelink.blob.core.windows.net),并通过azurerm_private_dns_zone_virtual_network_link关联到目标 VNet,否则 VM 无法解析到 Private Endpoint 的私有 IP。 - 验证
azurerm_private_endpoint_dns_zone_group资源是否将 Private Endpoint 与上述 DNS Zone 关联,确保域名解析指向私有 IP。 - 登录 VM 执行
nslookup formuleinsstorage.blob.core.windows.net,若返回公网 IP,说明 DNS 配置缺失或错误。
4. 排查 NSG 与路由表规则
- 检查
vm_subnet的 NSG 是否允许出站流量到10.0.2.0/24段(ICMP、TCP 443 等必要协议),即使在同一 VNet,NSG 规则限制也会导致连通性失败。 - 确认
storage_account_subnet的 NSG 允许来自vm_subnet的入站流量到 Private Endpoint 的 IP。 - 检查路由表是否存在自定义路由将存储账户流量导向公网,避免 UDR 干扰 Private Link 的流量路径。
5. 确认存储账户的网络访问配置
- 检查存储账户的网络设置是否允许 Private Endpoint 访问:若设置为“允许选定的网络”,需在
azurerm_storage_account的network_rules块中添加private_endpoint_ids参数,关联创建的 Private Endpoint ID。
示例配置:resource "azurerm_storage_account" "example" { name = "formuleinsstorage" resource_group_name = azurerm_resource_group.example.name location = azurerm_resource_group.example.location account_tier = "Standard" account_replication_type = "LRS" network_rules { default_action = "Deny" private_endpoint_ids = [azurerm_private_endpoint.example.id] } } - 避免存储账户仅配置为允许服务端点访问,需确保 Private Endpoint 被纳入允许列表。
6. 检查 Terraform 配置的语法与部署日志
- 核对 Terraform 代码是否符合 azurerm v3.30.0 的语法要求,该版本部分资源参数可能存在变动,比如
private_service_connection的结构是否正确。 - 查看
terraform plan和terraform apply的输出日志,排查是否有资源创建失败、警告或配置遗漏(如 DNS Zone 关联失败、Private Endpoint 未正确绑定存储账户)。
内容的提问来源于stack exchange,提问作者Sal-laS
相关产品推荐
相关产品推荐

