咨询: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变量,具体步骤如下:
移除所有
merge_with_existing变量相关逻辑:删除该变量的定义及所有引用。添加资源存在性检查数据源:用
azurerm_resources检查目标Web App是否已存在:
data "azurerm_resources" "app_check" { type = "Microsoft.Web/sites" name = local.app_name resource_group_name = var.resource_group_name }
- 调整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 }
- 更新应用设置合并逻辑:根据数据源是否存在来决定是否合并现有设置:
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
相关产品推荐
相关产品推荐

