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

使用Switch-AzWebAppSlot交换部署槽 验证状态及日志为空问题排查

Azure Function 部署槽交换状态验证方案

原脚本$log查询为空的原因

不存在遗漏的配置问题,核心是三个逻辑设计缺陷:

  • 日志同步延迟:Get-AzLog拉取的是Azure平台全局活动日志,操作发生后需要1~5分钟才能同步到可查询接口,执行完交换命令仅等待30秒就查询,大概率日志还未写入,自然返回空结果。
  • 过滤条件不准确:你使用-Caller SlotSwapJobProcessor作为过滤规则不符合平台实际行为,带预览的两阶段槽交换中,第一阶段应用槽配置的作业调用方并不固定为该处理器,很容易把目标日志过滤掉;如果脚本执行时间跨自然日,你用当日0点作为查询起始时间,也可能漏查前一天末尾触发的操作记录。
  • 缺少前置错误捕获:如果执行身份缺少槽交换权限、参数填写错误,Switch-AzWebAppSlot会直接报错终止,根本不会触发平台侧的槽交换作业,自然不会生成对应日志,原脚本的catch块未输出具体错误信息,很难定位这类前置问题。

可靠的状态验证实现方案

不建议用活动日志作为部署流程中的实时状态判断依据,采用两层校验逻辑即可,不需要额外配置:

  1. 所有Azure PowerShell命令添加-ErrorAction Stop参数,让命令执行错误直接触发catch块,配合PowerShell内置的$?自动变量(上一条命令执行无报错则返回$true),先校验命令本身是否提交成功。
  2. 命令提交成功后,放弃固定时长等待,改用轮询机制直接拉取Function App资源本身的操作状态,该接口状态延迟在10秒以内,准确率远高于活动日志查询。

可直接使用的参考脚本如下:

$resourceGroup = "替换为你的资源组名称"
$functionApp = "替换为你的函数应用名称"
$stagingSlot = "staging"
$prodSlot = "production"
$maxRetryTimes = 12 # 最长等待2分钟,每10秒轮询一次

try {
    Write-Host "开始执行 $functionApp 预交换槽配置应用"
    # 提交第一阶段配置应用操作
    Switch-AzWebAppSlot -ResourceGroupName $resourceGroup `
        -Name $functionApp `
        -SourceSlotName $stagingSlot `
        -DestinationSlotName $prodSlot `
        -SwapWithPreviewAction ApplySlotConfig `
        -ErrorAction Stop

    if (-not $?) {
        throw "配置应用命令提交失败"
    }

    # 轮询第一阶段操作状态
    $retry = 0
    $phase1Success = $false
    while ($retry -lt $maxRetryTimes) {
        Start-Sleep -Seconds 10
        $slotInfo = Get-AzWebAppSlot -ResourceGroupName $resourceGroup -Name $functionApp -Slot $prodSlot
        $opStatus = $slotInfo.OperationStatus
        if ($opStatus -eq "Succeeded") {
            $phase1Success = $true
            break
        }
        if ($opStatus -eq "Failed") {
            throw "预交换配置应用失败,平台返回操作状态为Failed"
        }
        $retry++
    }

    if (-not $phase1Success) {
        throw "预交换配置应用超时,2分钟内未返回成功状态,可执行ResetSlotSwap操作回滚"
    }

    Write-Host "预交换配置应用成功,开始执行正式槽交换"
    # 提交第二阶段完整交换操作
    Switch-AzWebAppSlot -ResourceGroupName $resourceGroup `
        -Name $functionApp `
        -SourceSlotName $stagingSlot `
        -DestinationSlotName $prodSlot `
        -SwapWithPreviewAction CompleteSlotSwap `
        -ErrorAction Stop

    if (-not $?) {
        throw "正式交换命令提交失败"
    }

    # 轮询第二阶段操作状态
    $retry = 0
    $phase2Success = $false
    while ($retry -lt $maxRetryTimes) {
        Start-Sleep -Seconds 10
        $appInfo = Get-AzWebApp -ResourceGroupName $resourceGroup -Name $functionApp
        $opStatus = $appInfo.OperationStatus
        if ($opStatus -eq "Succeeded") {
            $phase2Success = $true
            break
        }
        if ($opStatus -eq "Failed") {
            throw "正式槽交换失败,平台返回操作状态为Failed"
        }
        $retry++
    }

    if ($phase2Success) {
        Write-Host "$functionApp 部署槽交换流程执行完成"
    } else {
        throw "正式槽交换超时,2分钟内未返回成功状态"
    }
}
catch {
    Write-Host "槽交换流程异常:$($_.Exception.Message)"
    # 异常场景可按需开启回滚逻辑
    # Switch-AzWebAppSlot -ResourceGroupName $resourceGroup -Name $functionApp -SourceSlotName $stagingSlot -DestinationSlotName $prodSlot -SwapWithPreviewAction ResetSlotSwap -ErrorAction SilentlyContinue
    exit 1
}

补充说明:如果在第一阶段配置应用完成后,你需要先验证生产槽的预热配置是否符合预期,再决定执行完成交换还是回滚,只需要在第一阶段状态校验通过后插入你的验证逻辑即可,验证通过再调用CompleteSlotSwap动作,验证失败调用ResetSlotSwap回滚。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:54:22