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

如何设计Terraform代码批量创建Azure函数应用并支持部分自定义虚拟应用?

解决方案:基于for_each实现带差异化虚拟应用的Windows函数应用部署

你完全可以抛弃模板部署,改用Terraform原生的dynamic块配合for_each来实现需求,核心思路是用统一的数据结构管理所有应用的配置,差异化配置单独定义。

步骤1:定义包含差异化配置的应用清单

把20个应用的配置集中放在一个本地map里,默认应用留空virtual_apps字段,需要虚拟应用的特殊应用填充具体配置:

locals {
  function_apps = {
    # 18个默认配置应用
    app-01 = {
      name                = "func-app-01"
      resource_group_name = "rg-func-demo"
      # 其他通用配置(比如service_plan_id、storage_account_id等)
      virtual_apps        = []
    }
    app-02 = {
      name                = "func-app-02"
      resource_group_name = "rg-func-demo"
      # 其他通用配置
      virtual_apps        = []
    }
    # ... 追加其余16个默认应用

    # 2个带虚拟应用的特殊应用
    app-special-01 = {
      name                = "func-app-special-01"
      resource_group_name = "rg-func-demo"
      # 其他通用配置
      virtual_apps = [
        {
          virtual_path    = "/api"
          physical_path   = "site\\wwwroot\\api"
          preload_enabled = true
        },
        {
          virtual_path    = "/docs"
          physical_path   = "site\\wwwroot\\docs"
        }
      ]
    }
    app-special-02 = {
      name                = "func-app-special-02"
      resource_group_name = "rg-func-demo"
      # 其他通用配置
      virtual_apps = [
        {
          virtual_path    = "/admin"
          physical_path   = "site\\wwwroot\\admin"
          preload_enabled = false
        }
      ]
    }
  }
}

步骤2:用for_each+dynamic块部署资源

在azurerm_windows_function_app资源中,通过for_each遍历上述清单,并用dynamic "virtual_app"块动态生成虚拟应用配置(仅当对应应用的virtual_apps字段非空时生效):

resource "azurerm_windows_function_app" "main" {
  for_each = local.function_apps

  # 通用配置
  name                = each.value.name
  resource_group_name = each.value.resource_group_name
  location            = azurerm_resource_group.rg-func-demo.location
  service_plan_id     = azurerm_service_plan.func-plan.id
  storage_account_id  = azurerm_storage_account.func-storage.id
  storage_account_access_key = azurerm_storage_account.func-storage.primary_access_key

  # 通用站点配置
  site_config {
    dotnet_framework_version = "v6.0"
    # 其他通用site配置...
  }

  # 动态生成虚拟应用
  dynamic "virtual_app" {
    for_each = each.value.virtual_apps
    content {
      virtual_path    = virtual_app.value.virtual_path
      physical_path   = virtual_app.value.physical_path
      # 可选参数设置默认值,避免配置缺失报错
      preload_enabled = lookup(virtual_app.value, "preload_enabled", false)
    }
  }
}

方案优势

  • 完全保留for_each的特性:支持增量更新、资源唯一标识、并行部署
  • 原生依赖azurerm_windows_function_app的virtual_app块,无需额外模板部署资源,降低复杂度
  • 配置集中管理,差异化逻辑清晰,新增/修改应用只需调整local.function_apps即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:25:09