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

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.0
    
  • function.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:55:27