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

