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" } }
问题根源
- Terraform未标记槽专属设置:默认情况下,Azure会把所有未标记为"槽特定"的App-Settings视为可交换项。你的代码里没配置
slot_config_names,导致Terraform部署时,主应用和槽的设置没有明确区分,部署过程中就会出现互相覆盖的情况。 - 槽交换命令的默认行为:
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
相关产品推荐
相关产品推荐

