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

Azure Windows函数应用与部署槽App-Settings互换问题求助

问题描述

我通过GitLab-CI流水线,用Terraform AzureRM 3.66部署Azure Windows函数应用。部署后发现主函数应用的App-Settings跑到了部署槽里,而部署槽的App-Settings反而到了主应用上。之后我单独执行槽交换命令az functionapp deployment slot swap -g MyResourceGroup -n MyUniqueApp --slot staging --target-slot production,结果还是出现主应用和槽的设置互换的问题。

示例Terraform代码如下:

resource "azurerm_windows_function_app" "example" {
  name                 = "example-windows-function-app"
  resource_group_name  = azurerm_resource_group.example.name
  location             = azurerm_resource_group.example.location
  storage_account_name = azurerm_storage_account.example.name
  service_plan_id      = azurerm_service_plan.example.id

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME" = "dotnet"
    "SOME_APP_SETTING_KEY"    = "main-func-value"
    "ANOTHER_APP_SETTING_KEY" = "main-func-value"
  }
}

resource "azurerm_windows_function_app_slot" "example" {
  name                 = "example-slot"
  function_app_id      = azurerm_windows_function_app.example.id
  storage_account_name = azurerm_storage_account.example.name

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME" = "dotnet"
    "SOME_APP_SETTING_KEY"    = "staging_value"
    "ANOTHER_APP_SETTING_KEY" = "staging_another_value"
  }
}
问题根源
  1. Terraform未标记槽专属设置:默认情况下,Azure会把所有未标记为"槽特定"的App-Settings视为可交换项。你的代码里没配置slot_config_names,导致Terraform部署时,主应用和槽的设置没有明确区分,部署过程中就会出现互相覆盖的情况。
  2. 槽交换命令的默认行为:az functionapp deployment slot swap默认会交换所有非槽特定的设置,就算你单独执行交换命令,这些未标记的设置还是会被互相替换。
解决方法

1. 在Terraform中配置槽专属设置

通过slot_config_names字段标记哪些App-Settings是槽专属的,这些设置不会在交换时被替换。修改后的代码示例:

resource "azurerm_windows_function_app" "example" {
  name                 = "example-windows-function-app"
  resource_group_name  = azurerm_resource_group.example.name
  location             = azurerm_resource_group.example.location
  storage_account_name = azurerm_storage_account.example.name
  service_plan_id      = azurerm_service_plan.example.id

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME" = "dotnet"
    "SOME_APP_SETTING_KEY"    = "main-func-value"
    "ANOTHER_APP_SETTING_KEY" = "main-func-value"
  }

  # 标记这些设置为槽专属,交换时不会被替换
  slot_config_names {
    app_setting_names = ["SOME_APP_SETTING_KEY", "ANOTHER_APP_SETTING_KEY"]
  }
}

resource "azurerm_windows_function_app_slot" "example" {
  name                 = "example-slot"
  function_app_id      = azurerm_windows_function_app.example.id
  storage_account_name = azurerm_storage_account.example.name

  app_settings = {
    "FUNCTIONS_WORKER_RUNTIME" = "dotnet"
    "SOME_APP_SETTING_KEY"    = "staging_value"
    "ANOTHER_APP_SETTING_KEY" = "staging_another_value"
  }
}

2. 修改槽交换命令的参数

如果不想交换任何App-Settings,可以在命令里加上--preserve-slot-settings参数,这样交换时会保留槽的原有设置:

az functionapp deployment slot swap -g MyResourceGroup -n MyUniqueApp --slot staging --target-slot production --preserve-slot-settings

如果只需要交换特定设置,比如运行时配置,可以用--app-settings-to-swap指定:

az functionapp deployment slot swap -g MyResourceGroup -n MyUniqueApp --slot staging --target-slot production --app-settings-to-swap "FUNCTIONS_WORKER_RUNTIME"

3. 调整流水线执行顺序

确保GitLab-CI里先完成Terraform的部署任务,等主应用和槽的设置都部署到位后,再执行槽交换命令,避免部署未完成就触发交换导致的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:35:14