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

如何让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
}

部署流程:

  1. 执行 terraform apply -var lock_down_network=false 完成基础资源部署
  2. 确认函数应用正常后,执行 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:55:16