如何让azurerm_linux_function_app适配存储账户网络规则与私有端点?
解决方案
1. 部署阶段临时放宽存储账户访问权限(规避403错误)
部署时函数应用需要访问存储账户创建文件共享,但严格的网络规则会阻断这个过程。可以通过Terraform变量控制,分两步完成部署:
- 初始阶段允许Azure服务访问存储账户,完成函数应用、私有端点等资源部署
- 部署完成后再收紧网络规则,仅允许私有端点和指定子网访问
示例Terraform代码片段:
resource "azurerm_storage_account_network_rules" "func_storage" { storage_account_id = azurerm_storage_account.func_storage.id # 用变量控制规则松紧,初始部署设为false,完成后设为true default_action = var.lock_down_network ? "Deny" : "Allow" allow_azure_services = var.lock_down_network ? false : true # 始终保留私有端点访问权限 private_endpoint { id = azurerm_private_endpoint.storage_pe.id } # 允许函数应用所在子网访问 virtual_network_subnet_ids = [azurerm_subnet.func_subnet.id] } variable "lock_down_network" { type = bool default = false }
部署流程:
- 执行
terraform apply -var lock_down_network=false完成基础资源部署 - 确认函数应用正常后,执行
terraform apply -var lock_down_network=true收紧网络规则
2. 配置私有DNS解析(解决触发器同步失败)
函数应用在子网内时,必须通过私有DNS区域解析存储账户的私有IP,否则会尝试公网访问被拒绝。需完成以下配置:
- 创建存储文件和Blob服务对应的私有DNS区域
- 将私有端点关联到这些DNS区域
- 把函数应用所在的虚拟网络链接到DNS区域
示例Terraform代码:
# 文件共享私有DNS区域 resource "azurerm_private_dns_zone" "storage_file" { name = "privatelink.file.core.windows.net" resource_group_name = azurerm_resource_group.rg.name } # Blob服务私有DNS区域 resource "azurerm_private_dns_zone" "storage_blob" { name = "privatelink.blob.core.windows.net" resource_group_name = azurerm_resource_group.rg.name } # 虚拟网络链接到DNS区域 resource "azurerm_private_dns_zone_virtual_network_link" "file_link" { name = "file-dns-link" private_dns_zone_name = azurerm_private_dns_zone.storage_file.name virtual_network_id = azurerm_virtual_network.vnet.id resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_private_dns_zone_virtual_network_link" "blob_link" { name = "blob-dns-link" private_dns_zone_name = azurerm_private_dns_zone.storage_blob.name virtual_network_id = azurerm_virtual_network.vnet.id resource_group_name = azurerm_resource_group.rg.name } # 私有端点关联双DNS区域 resource "azurerm_private_endpoint" "storage_pe" { name = "storage-pe" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location subnet_id = azurerm_subnet.pe_subnet.id private_service_connection { name = "storage-pe-conn" private_connection_resource_id = azurerm_storage_account.func_storage.id subresource_names = ["file", "blob"] is_manual_connection = false } private_dns_zone_group { name = "storage-dns-group" private_dns_zone_ids = [azurerm_private_dns_zone.storage_file.id, azurerm_private_dns_zone.storage_blob.id] } }
3. 配置函数应用权限
确保函数应用有访问存储账户的权限,添加角色分配:
resource "azurerm_role_assignment" "func_storage_access" { scope = azurerm_storage_account.func_storage.id role_definition_name = "Storage File Data SMB Share Contributor" principal_id = azurerm_linux_function_app.func_app.identity[0].principal_id } resource "azurerm_role_assignment" "func_blob_access" { scope = azurerm_storage_account.func_storage.id role_definition_name = "Storage Blob Data Contributor" principal_id = azurerm_linux_function_app.func_app.identity[0].principal_id }
关键注意事项
- 部署顺序:先创建存储账户(宽松规则)→ 私有端点及DNS配置 → 函数应用(关联子网)→ 收紧存储网络规则
- 必须确保虚拟网络与私有DNS区域的链接生效,否则函数应用无法解析存储私有域名
- 函数应用无需额外配置存储私有端点信息,DNS解析正常即可自动路由私有流量
内容的提问来源于stack exchange,提问作者Accidental Admin
相关产品推荐
相关产品推荐

