使用YAML任务交换Azure部署槽后staging槽函数缺失问题
问题根因
当前配置遗漏了Azure函数部署槽交换必需的粘滞槽设置(Deployment Slot Setting),使用的老版本交换任务缺少前置校验逻辑,最终导致交换后staging槽运行时无法加载函数代码。
核心触发逻辑:
- Azure函数有一组和槽强绑定的配置,不能随交换动作在槽间流转,包括
WEBSITE_CONTENTSHARE、WEBSITE_CONTENTAZUREFILECONNECTIONSTRING、WEBSITE_RUN_FROM_PACKAGE、FUNCTIONS_EXTENSION_VERSION这类指向槽专属存储路径、固定运行时版本的配置项。如果不将这些配置标记为「粘滞到槽、不参与交换」,交换后staging槽会拿到原生产槽的路径配置,指向的存储位置要么没有有效函数包,要么路径权限不匹配,运行时加载不到任何函数。 - 所用的
AzureAppServiceManage@0为较早版本的任务,默认不会在交换前做槽配置合法性校验,也不会自动处理函数专属的粘滞设置逻辑,容易触发配置错位。
解决方法
按以下步骤操作即可修复:
- 先在Azure门户配置两个槽的粘滞设置
- 分别进入生产槽、staging槽的「配置」页面
- 找到以下配置项,勾选「部署槽设置」选项后保存:
WEBSITE_CONTENTSHAREWEBSITE_CONTENTAZUREFILECONNECTIONSTRINGWEBSITE_RUN_FROM_PACKAGEFUNCTIONS_EXTENSION_VERSION- 所有自定义的、不需要在槽间同步的环境变量
- 注意两个槽的
WEBSITE_CONTENTSHARE值不能重复,生产槽默认值一般为<函数应用名>,staging槽修改为<函数应用名>__staging做区分即可。
- 修正流水线中的交换任务配置,补充必要参数,修正后的YAML如下:
- task: AzureAppServiceManage@0 displayName: 'swap slots' inputs: azureSubscription: ${{parameters.serviceConnection}} webAppName: '${{ parameters.solutionAbbreviation }}-compute-${{ parameters.environmentAbbreviation }}-${{ parameters.name }}' resourceGroupName: ${{parameters.solutionAbbreviation}}-compute-${{parameters.environmentAbbreviation}} sourceSlot: staging swapWithProduction: true PreserveVnet: true SlotStickyConfig: true
- 配置修改完成后,先将完整函数包重新部署到staging槽,再执行交换操作,两个槽即可正常加载对应函数。
补充:正常槽交换完成后,staging槽会持有交换前生产槽的代码版本,生产槽持有交换前staging槽的新版本,不会出现空槽情况。如果配置完粘滞设置后仍出现空槽,进入staging槽的部署中心,断开后重新连接部署源,触发一次staging槽全量重部署即可。
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

