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

咨询:Terraform中Azure Web App的app_settings无变量实现方案

问题描述

我正在搭建Azure Web App,希望实现两类应用设置(app_settings)的管理逻辑:

  • 一类值仅在不存在时添加,允许后续在Azure门户手动覆盖
  • 另一类值强制设为固定值,不允许被手动修改

目前我已经实现了这个逻辑,但必须依赖一个merge_with_existing变量:首次创建环境时将其设为"n",否则data.azurerm_linux_web_app.app会因Web App不存在而抛出异常。

请问有没有无需这个变量就能实现的方法?

当前Terraform代码

locals {
  app_name = "${var.environment}myappname"
}

data "azurerm_client_config" "current" {}
data "azurerm_linux_web_app" "app" {
  count = var.merge_with_existing == "n" ? 0 : 1

  name = local.app_name
  resource_group_name = var.resource_group_name
}


locals {
  scopes = "api://${var.aad_tenant_id}/access_as_user"

  app_settings_template = {
    
    web_configurable_values = {
      APPLICATIONINSIGHTS_CONNECTION_STRING = ""
      Logging__LogLevel__Default = "Information"
      "Logging__LogLevel__Microsoft.AspNetCore" = "Information"
      WEBSITE_HTTPLOGGING_RETENTION_DAYS = "28"
    }

    priority_values = {
      AllowedHosts = "*"
      APPINSIGHTS_PROFILERFEATURE_VERSION = "1.0.0"
      APPINSIGHTS_SNAPSHOTFEATURE_VERSION = "1.0.0"
      ApplicationInsightsAgent_EXTENSION_VERSION = "~2"
      DiagnosticServices_EXTENSION_VERSION = "~3"
      InstrumentationEngine_EXTENSION_VERSION = "~1"
      XDT_MicrosoftApplicationInsights_BaseExtensions = "~"
      XDT_MicrosoftApplicationInsights_Mode = "recommended"
      XDT_MicrosoftApplicationInsights_PreemptSdk = "disabled"
    }
  }

  app_settings = merge(
    var.merge_with_existing == "n" 
      ? local.app_settings_template.web_configurable_values
      : merge(
          local.app_settings_template.web_configurable_values,
          data.azurerm_linux_web_app.app[0].app_settings),
    local.app_settings_template.priority_values)
}

resource "azurerm_service_plan" "app_service_plan" {
  name                = "${var.environment}myappname"
  resource_group_name = var.resource_group_name
  location            = var.location
  os_type             = "Linux"
  sku_name            = "B1"
}

resource "azurerm_linux_web_app" "app" {
  name                = "${var.environment}myappname"
  resource_group_name = var.resource_group_name
  location            = var.location
  service_plan_id     = azurerm_service_plan.app_service_plan.id
  https_only          = true

  site_config {
    always_on = false
    application_stack {
        dotnet_version  = "7.0"
    }
  }

  app_settings = local.app_settings
}
解决方案

可以通过自动检测Web App是否存在来替代手动传入的merge_with_existing变量,具体步骤如下:

  1. 移除所有merge_with_existing变量相关逻辑:删除该变量的定义及所有引用。

  2. 添加资源存在性检查数据源:用azurerm_resources检查目标Web App是否已存在:

data "azurerm_resources" "app_check" {
  type                = "Microsoft.Web/sites"
  name                = local.app_name
  resource_group_name = var.resource_group_name
}
  1. 调整Web App数据源的count逻辑:根据检查结果决定是否读取现有Web App的设置:
data "azurerm_linux_web_app" "app" {
  count = length(data.azurerm_resources.app_check.resources) > 0 ? 1 : 0

  name                = local.app_name
  resource_group_name = var.resource_group_name
}
  1. 更新应用设置合并逻辑:根据数据源是否存在来决定是否合并现有设置:
locals {
  # 其他local定义保持不变...

  app_settings = merge(
    # 如果Web App已存在,合并默认可配置值与现有设置;否则仅用默认可配置值
    length(data.azurerm_linux_web_app.app) == 1
      ? merge(local.app_settings_template.web_configurable_values, data.azurerm_linux_web_app.app[0].app_settings)
      : local.app_settings_template.web_configurable_values,
    # 强制覆盖固定值,确保这些设置不会被手动修改
    local.app_settings_template.priority_values
  )
}

逻辑说明

  • 首次创建:azurerm_resources.app_check找不到目标Web App,返回空结果,因此data.azurerm_linux_web_app.app的count为0,直接使用web_configurable_values作为基础设置,再合并priority_values固定值。
  • 后续运行:Web App已存在,data.azurerm_linux_web_app.app会读取现有设置,合并web_configurable_values(仅补充不存在的键),最后用priority_values覆盖所有对应键,确保固定值不被手动修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:05:03