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

Terraform部署Azure Function时无法找到host.json文件求助

解决Azure Function部署后找不到host.json的问题

部署Terraform定义的Python Azure Function时,出现Could not find file 'C:\home\site\wwwroot\host.json'错误,函数主机无法启动。以下是针对性的排查和修复步骤:

1. 修正Terraform压缩包路径配置

你的archive_file资源中source_dir路径错误,导致生成的zip包结构不符合Azure Function要求:

  • 当前错误路径:"./modules/azure_function_secrets/src"
  • 正确路径:"./src"(main.tf位于azure_function_secrets目录下,相对路径应指向同级的src文件夹)

修正后的archive_file代码:

data "archive_file" "functionapp_zip" {
  type        = "zip"
  source_dir  = "./src"  # 修正为相对main.tf的正确路径
  output_path = "./functionapp.zip"  # 同步修正输出路径,避免嵌套
}

2. 补充存储Blob资源定义

你的azurerm_function_app引用了azurerm_storage_blob.functionapp_secrets_code.url,但代码中未定义该Blob资源,导致zip包未上传到存储账户,wwwroot目录为空。添加以下资源:

# 创建存储容器用于存放函数代码包
resource "azurerm_storage_container" "functionapp_code_container" {
  name                  = "function-code"
  storage_account_name  = var.storage_account_name
  container_access_type = "private"
}

# 上传生成的zip包到存储Blob
resource "azurerm_storage_blob" "functionapp_secrets_code" {
  name                   = "functionapp.zip"
  storage_account_name   = var.storage_account_name
  storage_container_name = azurerm_storage_container.functionapp_code_container.name
  type                   = "Block"
  source                 = data.archive_file.functionapp_zip.output_path
}

3. 统一资源组引用

azurerm_function_app中resource_group_name使用了data.azurerm_resource_group.arc_resource_group.name,而azurerm_app_service_plan使用的是data.azurerm_resource_group.resource_group.name,这会导致资源跨组引发异常。修正为统一的资源组:

resource "azurerm_function_app" "secrets_function" {
  name                       = "secrets-function"
  resource_group_name        = data.azurerm_resource_group.resource_group.name  # 与应用服务计划统一
  location                   = data.azurerm_resource_group.resource_group.location
  # 其余配置保持不变
}

4. 验证压缩包结构

手动解压生成的functionapp.zip,确保根目录直接包含:

  • host.json
  • requirements.txt
  • azure_func文件夹(内含azure_func.py和function.json)

如果zip包内嵌套了src文件夹,说明source_dir配置仍有问题,需再次检查路径。

5. 优化函数代码的Key Vault配置

将硬编码的Key Vault URL改为通过环境变量获取,提升灵活性:

  1. 在azurerm_function_app的app_settings中添加:
app_settings = {
  # 其余配置不变
  "KEY_VAULT_URL" = "https://<vault_name>.vault.azure.net/"
}
  1. 修改函数代码:
import os
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
import azure.functions as func
import logging

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python secret retrieval function triggered.')

    try:
        key_vault_url = os.getenv("KEY_VAULT_URL")
        credential = DefaultAzureCredential()
        secret_client = SecretClient(vault_url=key_vault_url, credential=credential)

        user = secret_client.get_secret('username').value
        password = secret_client.get_secret('password').value

        return func.HttpResponse(
            body = f'{{"user": "{user}", "password": "{password}"}}',
            mimetype="application/json"
        )
    except Exception as e:
        logging.error(f"Error retrieving secrets: {str(e)}")
        return func.HttpResponse(
            "Failed to retrieve secrets",
            status_code=500
        )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:14:58