如何定时自动执行Azure App Service部署槽交换?
Azure App Service部署槽定时自动交换的实现方案
完全可以实现凌晨2-3点的定时自动交换需求,下面分两种常用方式说明:
一、通过Azure可视化界面配置(无需编写复杂脚本)
方式1:Azure Automation Runbook
- 登录Azure门户,创建一个Automation账户,然后新建PowerShell类型的Runbook
- 写入核心交换逻辑的脚本(需确保Automation账户已安装Az模块):
# 用托管身份登录Azure Connect-AzAccount -Identity # 执行槽交换 Set-AzWebAppSlot -ResourceGroupName "你的资源组名称" -Name "你的App Service名称" -SourceSlotName "Test" -DestinationSlotName "Production" -SwapWithPreviewAction Swap - 给这个Automation账户分配网站参与者角色,确保它拥有操作部署槽的权限
- 在Runbook的触发器设置里,添加定时触发器,设置执行时间为凌晨2-3点(注意时区选UTC,或者根据本地时区调整),并设置每天重复执行
方式2:Azure DevOps定时发布管道
- 打开你的Azure DevOps发布管道,添加一个Azure App Service部署槽交换任务
- 配置任务参数:源槽选Test,目标槽选Production,按需勾选保留应用设置、连接字符串等选项
- 切换到管道的触发器标签,添加计划触发器,设置执行时间为凌晨2-3点,频率设为每天
- 如果需要先确认Test槽测试通过,可在交换任务前添加人工审批步骤,只有审批通过后,定时任务才会执行交换操作
二、脚本+系统定时任务(灵活自定义场景)
Windows环境(任务计划程序)
- 编写PowerShell脚本(用服务主体身份验证,避免交互式登录):
# 通过服务主体登录 $servicePrincipal = Connect-AzAccount -ServicePrincipal -TenantId "你的租户ID" -ApplicationId "你的服务主体ID" -CertificateThumbprint "证书指纹" # 执行槽交换 Set-AzWebAppSlot -ResourceGroupName "资源组名称" -Name "App Service名称" -SourceSlotName "Test" -DestinationSlotName "Production" - 打开Windows任务计划程序,创建定时任务,设置凌晨2点执行该脚本,确保执行账户有足够权限
Linux环境(Cron定时任务)
- 编写Azure CLI脚本:
# 服务主体登录 az login --service-principal -u "服务主体ID" -p "服务主体密钥" --tenant "租户ID" # 执行槽交换 az webapp deployment slot swap --resource-group "资源组名称" --name "App Service名称" --slot "Test" --target-slot "Production" - 编辑crontab配置,添加定时任务:
# 每天凌晨2点执行交换(UTC时区,需根据本地时区调整) 0 2 * * * /usr/bin/az webapp deployment slot swap --resource-group "资源组名称" --name "App Service名称" --slot "Test" --target-slot "Production"
关键提示
- 交换前务必确保Test槽的应用已通过测试,避免影响生产环境;可在脚本中添加健康检查逻辑(比如调用应用的健康状态接口),检查通过后再执行交换
- 注意时区设置,Azure默认用UTC,要根据你的业务时区调整定时时间
- 开启操作日志记录,方便后续排查问题
内容的提问来源于stack exchange,提问作者LarryBud
相关产品推荐
相关产品推荐

