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

如何将Azure Functions部署至带专用终结点的私有存储账户?

私有存储账户下部署Azure Functions及Terraform状态存储方案

一、Azure门户/VS Code部署方案

默认情况下,门户和VS Code的可视化创建流程会强制校验存储账户的公共访问权限,得绕开这个限制手动操作:

  • 先建好禁用公共访问+配置私有端点的存储账户,确保Blob、文件服务都设置为仅允许私有网络/私有端点访问。
  • 创建函数应用时,要么先用临时公共存储账户完成创建(后续替换),要么直接用Azure CLI创建(CLI不会做强制校验)。
  • 函数应用建好后,进入配置→应用程序设置,把AzureWebJobsStorage和WEBSITE_CONTENTAZUREFILECONNECTIONSTRING这两个连接字符串,换成私有存储账户的连接字符串。
  • 给函数应用开启VNet集成,连接到存储账户所在的VNet,或者确保两者在同一网络环境,保证函数能访问私有存储。
  • 最后删掉临时的公共存储账户就行。

VS Code里可以先用CLI搞定函数应用的创建和存储关联,再用VS Code部署代码,避开可视化流程的限制。

二、Terraform部署Azure Functions到私有存储

用Terraform可以直接指定私有存储账户,不用默认创建公共存储的逻辑:

  • 定义私有存储账户时,明确禁用公共访问并配置私有端点:
resource "azurerm_storage_account" "private_func_storage" {
  name                     = "privatestorageaccount"
  resource_group_name      = azurerm_resource_group.rg.name
  location                 = azurerm_resource_group.rg.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
  allow_blob_public_access = false

  network_rules {
    default_action = "Deny"
    private_endpoint_ids = [azurerm_private_endpoint.storage_pe.id]
  }
}
  • 定义函数应用时,直接引用这个私有存储的连接字符串,同时开启VNet集成保证网络连通:
resource "azurerm_function_app" "example" {
  name                       = "example-function-app"
  resource_group_name        = azurerm_resource_group.rg.name
  location                   = azurerm_resource_group.rg.location
  app_service_plan_id        = azurerm_app_service_plan.example.id
  storage_account_name       = azurerm_storage_account.private_func_storage.name
  storage_account_access_key = azurerm_storage_account.private_func_storage.primary_access_key

  app_settings = {
    AzureWebJobsStorage        = azurerm_storage_account.private_func_storage.primary_connection_string
    WEBSITE_CONTENTAZUREFILECONNECTIONSTRING = azurerm_storage_account.private_func_storage.primary_connection_string
    WEBSITE_VNET_ROUTE_ALL     = "1" # 启用全路由,确保能访问私有存储
  }

  vnet_integration {
    subnet_id = azurerm_subnet.func_subnet.id
  }
}

三、Terraform状态存储用私有账户

Terraform状态存储可以用私有账户,只要解决网络访问和权限问题:

  • 先创建禁用公共访问的存储账户,配置Blob服务的私有端点。
  • 配置Terraform backend时,指定这个私有账户,同时开启Azure AD认证,或者确保运行Terraform的环境能访问私有端点:
terraform {
  backend "azurerm" {
    resource_group_name  = "rg-terraform-state"
    storage_account_name = "privatestatestorage"
    container_name       = "tfstate"
    key                  = "prod/terraform.tfstate"
    use_azuread_auth     = true
  }
}
  • 运行Terraform的机器要在能访问私有存储的网络里(比如VNet虚拟机、VPN连接的本地机器),同时给运行Terraform的身份(服务主体或用户)分配Storage Blob Data Contributor角色,让它能读写状态文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:23:14