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

Terraform部署Azure Linux函数应用时存储账户地址错误问题

问题分析与解决方案

问题根源

你遇到的错误本质是Azure Linux函数应用要求关联的存储账户必须为通用用途(General Purpose)v1或v2类型,但你当前给函数应用指定的是BlobStorage专用类型账户。这类专用账户仅支持Blob服务(blob.core.windows.net),不提供File服务(file.core.windows.net),而函数应用初始化时会尝试访问File端点完成内部文件共享、日志存储等操作,因此触发地址解析失败。

你手动修改WEBSITE_RUN_FROM_PACKAGE地址能下载代码包,是因为该配置仅负责拉取函数代码,但函数应用的核心运行依赖(如触发器状态、临时文件存储)仍需依赖支持File服务的通用存储账户,所以仅改包地址无法解决整体创建失败的问题。

修复方案

新增一个通用用途v2存储账户供函数应用专用,原BlobStorage账户继续存放函数代码包。调整后的Terraform代码如下:

1. 新增通用用途存储账户

resource "azurerm_storage_account" "mtr_function_app_storage" {
  name                     = "mtrfuncstorage${random_string.random_storage_account_suffix.result}"
  resource_group_name      = azurerm_resource_group.mtr_rg.name
  location                 = azurerm_resource_group.mtr_rg.location
  account_kind             = "StorageV2" # 指定为通用用途v2
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = var.environment_name
  }
}

2. 修改函数应用配置

将函数应用的核心存储配置指向新的通用账户,保留原BlobStorage账户用于代码包地址:

resource "azurerm_linux_function_app" "mtr_hello_function" {
  name                       = "mtr-hello-function11"
  location                   = var.resource_group_location
  resource_group_name        = var.resource_group_name
  service_plan_id            = azurerm_service_plan.mtr_hello_function_svc_plan.id
  # 替换为通用用途存储账户
  storage_account_name       = azurerm_storage_account.mtr_function_app_storage.name
  storage_account_access_key = azurerm_storage_account.mtr_function_app_storage.primary_access_key

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME"    = "dotnet"
    "WEBSITE_RUN_FROM_PACKAGE"    = "https://${var.storage_account_name}.blob.core.windows.net/${azurerm_storage_container.mtr_hello_function_container.name}/${azurerm_storage_blob.mtr_hello_function_blob.name}${data.azurerm_storage_account_blob_container_sas.storage_account_blob_container_sas_for_hello.sas}"
    # 可选:将AzureWebJobsStorage也切换为通用账户,避免依赖BlobStorage账户
    "AzureWebJobsStorage"         = azurerm_storage_account.mtr_function_app_storage.primary_connection_string
    "AzureWebJobsDisableHomepage" = "true"
  }

  site_config {
    application_stack {
      dotnet_version              = "8.0"
      use_dotnet_isolated_runtime = true
    }

    cors {
      allowed_origins = ["*"]
    }
  }

  tags = {
    environment = var.environment_name
  }
}

3. 简化方案(可选)

如果不需要单独用BlobStorage账户存放代码包,可直接将原存储账户的account_kind改为StorageV2,一个账户即可满足所有需求,但需注意销毁重建可能带来的数据影响。

关键说明

  • Azure函数应用的运行依赖存储账户的File服务,这是平台硬性要求,专用BlobStorage账户无法满足该需求。
  • WEBSITE_RUN_FROM_PACKAGE的地址可以指向任意可访问的Blob存储(包括专用BlobStorage账户),但函数应用自身关联的存储账户必须为通用类型。

内容的提问来源于stack exchange,提问作者Marek M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:04:52