Terraform部署azurerm_function_app_function后自动消失问题求助
问题原因及解决方案
问题根源
Linux版Azure Functions采用部署包(Zip)驱动的运行模型,与Windows版的单函数管理逻辑完全不同。azurerm_function_app_function资源是针对Windows环境设计的,用于单独添加/修改函数;但在Linux环境中,函数应用会基于部署包同步文件系统,直接通过该资源添加的函数会被容器初始化流程覆盖,导致短暂显示后消失。
解决方案:改用Zip部署模式
通过Terraform部署Linux Python函数时,需使用azurerm_function_app_deployment资源发布完整的函数项目包,而非单独创建函数资源。
步骤1:准备函数项目结构
创建标准的Python函数项目目录,包含以下文件:
my-blob-trigger/ ├── __init__.py # 你的函数逻辑代码 ├── function.json # 函数绑定配置 └── requirements.txt # 依赖声明(至少包含azure-functions)
requirements.txt内容:azure-functions>=1.17.0function.json内容(注意连接字符串名称与后续配置一致):{ "scriptFile": "__init__.py", "disabled": false, "bindings": [ { "name": "myblob", "type": "blobTrigger", "direction": "in", "path": "${azurerm_storage_container.container1.name}/{name}", "connection": "${azurerm_storage_account.main.name}_STORAGE" } ] }
步骤2:修改Terraform配置
移除azurerm_function_app_function资源,添加Zip打包与部署逻辑:
# 1. 打包函数代码为Zip包 resource "null_resource" "package_function" { triggers = { # 文件内容变化时重新打包 init_content = sha256(file("my-blob-trigger/__init__.py")) config_content = sha256(file("my-blob-trigger/function.json")) reqs_content = sha256(file("my-blob-trigger/requirements.txt")) } provisioner "local-exec" { command = "cd my-blob-trigger && zip -r ../function.zip ." } } # 2. 调整函数应用配置,启用Zip部署模式 resource "azurerm_linux_function_app" "main" { name = "tf-linux-app" location = azurerm_resource_group.main.location resource_group_name = azurerm_resource_group.main.name service_plan_id = azurerm_service_plan.main.id storage_account_name = azurerm_storage_account.main.name storage_account_access_key = azurerm_storage_account.main.primary_access_key site_config { app_scale_limit = 200 elastic_instance_minimum = 0 application_stack { python_version = "3.9" } } app_settings = { # 统一连接字符串名称,与function.json匹配 "${azurerm_storage_account.main.name}_STORAGE" = azurerm_storage_account.main.primary_connection_string WEBSITE_RUN_FROM_PACKAGE = "1" # 启用Zip部署,这是Linux函数应用的核心配置 } client_certificate_mode = "Required" identity { type = "SystemAssigned" } } # 3. 部署Zip包到函数应用 resource "azurerm_function_app_deployment" "main" { name = "zipdeploy" function_app_id = azurerm_linux_function_app.main.id package_uri = "file://${path.module}/function.zip" depends_on = [null_resource.package_function] }
关键说明
WEBSITE_RUN_FROM_PACKAGE = "1":强制Linux函数应用从Zip包加载代码,避免文件系统被覆盖。- 连接字符串名称需保持一致:app_settings中的键名必须与
function.json里的connection字段完全匹配,否则触发器无法正常工作。 - Zip包需包含完整项目:不能只打包单个
__init__.py,必须包含所有依赖声明和配置文件。
内容的提问来源于stack exchange,提问作者mgw6
相关产品推荐
相关产品推荐

