基于Terraform部署Azure Function的相关技术问题咨询
针对你提出的三个关于Azure Function部署和Terraform配置的问题,我整理了详细的解决方案,结合你的现有代码片段给出具体示例:
除了Zip包部署,Azure Function还支持多种部署方式,以下是常用的几种及对应的Terraform配置:
容器镜像部署:适合容器化的Function项目,Terraform中可通过配置镜像仓库凭据和运行时版本实现
resource "azurerm_function_app" "azure_function_scenario1_hop2" { name = "scenario1-hop2-azure-function" location = var.location resource_group_name = var.resource_group_name app_service_plan_id = var.app_service_plan_id storage_connection_string = azurerm_storage_account.example.primary_connection_string # 配置容器镜像运行时 site_config { linux_fx_version = "DOCKER|${var.acr_login_server}/my-function-image:latest" } # 私有镜像仓库凭据 image_registry_credential { username = var.acr_username password = var.acr_password } }本地Git部署:将代码直接推送到Function App内置的Git仓库,Terraform可配置源代码管理关联
resource "azurerm_function_app" "azure_function_scenario1_hop2" { # 基础配置省略 source_control { repo_url = "https://github.com/your-username/your-function-repo.git" branch = "main" manual_integration = true # 手动触发部署,也可设置为自动 } }CI/CD流水线部署:通过GitHub Actions、Azure DevOps Pipelines等自动部署,Terraform只需确保Function App的基础配置,流水线负责代码构建和部署(无需额外Terraform配置,只需在流水线中添加部署步骤)
Azure Function App本身支持在同一个App下部署多个函数,核心是将所有函数的代码打包到同一个部署单元中:
Zip包部署:将所有函数的代码文件夹(每个函数包含
function.json)放在同一个根目录下,打包成Zip后上传。Terraform配置和单函数一致,只需更新WEBSITE_RUN_FROM_PACKAGE的包地址:resource "azurerm_function_app" "azure_function_scenario1_hop2" { # 基础配置省略 app_settings = { # 指向包含多函数代码的Zip包地址 WEBSITE_RUN_FROM_PACKAGE = "https://my-storage-account.blob.core.windows.net/packages/multi-function-package.zip?sv=..." # 其他应用设置 } }容器镜像部署:将所有函数代码放在镜像的
/home/site/wwwroot目录下(每个函数一个子文件夹),Terraform配置和单镜像部署一致,镜像构建时包含所有函数代码即可
根据代理用途分为两种场景,对应不同的Terraform配置:
1. 出站代理(Function代码调用外部服务时使用代理)
通过应用设置配置代理服务器地址,让Function的出站请求走指定代理:
resource "azurerm_function_app" "azure_function_scenario1_hop2" { # 基础配置省略 app_settings = { # HTTP/HTTPS代理地址 HTTP_PROXY = "http://your-proxy-server:8080" HTTPS_PROXY = "http://your-proxy-server:8080" # 无需走代理的地址(逗号分隔) NO_PROXY = "localhost,127.0.0.1,internal-service.azurewebsites.net" # 其他应用设置 } }
2. 反向代理(Function App作为代理转发请求)
需要在Function App的wwwroot目录下添加proxies.json配置文件,Terraform可通过打包部署的方式将该文件上传:
第一步:创建proxies.json示例
{ "$schema": "http://json.schemastore.org/proxies", "proxies": { "ApiProxy": { "matchCondition": { "route": "/api/proxy/{*path}" }, "backendUri": "https://target-api.example.com/{path}" } } }
第二步:Terraform打包部署包含proxies.json的代码包
# 打包包含函数代码和proxies.json的Zip包 data "archive_file" "function_package" { type = "zip" source_dir = "./function-code" # 目录下包含所有函数文件夹和proxies.json output_path = "./function-package.zip" } # 上传到存储账户 resource "azurerm_storage_blob" "function_blob" { name = "function-package.zip" storage_account_name = azurerm_storage_account.example.name storage_container_name = "packages" type = "Block" source = data.archive_file.function_package.output_path } # 生成SAS URL用于Function App访问包 data "azurerm_storage_account_sas" "function_sas" { connection_string = azurerm_storage_account.example.primary_connection_string https_only = true resource_types { object = true } services { blob = true } start = timestamp() expiry = timeadd(timestamp(), "365d") permissions { read = true } } resource "azurerm_function_app" "azure_function_scenario1_hop2" { # 基础配置省略 app_settings = { WEBSITE_RUN_FROM_PACKAGE = "https://${azurerm_storage_account.example.name}.blob.core.windows.net/${azurerm_storage_blob.function_blob.storage_container_name}/${azurerm_storage_blob.function_blob.name}${data.azurerm_storage_account_sas.function_sas.sas}" } }
内容的提问来源于stack exchange,提问作者Leonid

