Azure 自动化作业手动运行良好,但在由 webhook 触发时失败

Azure Automation Job runs fine manually but fails when triggered by webhook

我在 Azure 中有一个运行 Powershell 运行手册的自动化帐户。 当我通过门户触发它时,它运行得很好,手动指定输入

我创建了一个具有相同输入设置的网络钩子。我从 CURL 中调用它

curl -d '' https://800b2bec-b1ae-4fa1-ba30-8c7d32096828.webhook.ae.azure-automation.net/webhooks?[redactedtoken]

webhook 在门户中显示为已成功触发,但作业失败且没有可见错误。

没有输出,即使我的 powershell 函数的第一行是 Write-Output "Hello"

没有异常消息,根本没有日志。

知道我如何获得有关可能出现问题的更多信息吗?

我已经更新了 Az 模块并在 runbook 中启用了详细日志记录。

下面是完整的源代码,如果有帮助的话。

Param(
 [string]$resourceGroup,
 [string]$VMName,
 [string]$method,
 [string]$UAMI 
)
Write-Output "Hello"
$automationAccount = "AlsAutomation"

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process | Out-Null

# Connect using a Managed Service Identity
try {
        $AzureContext = (Connect-AzAccount -Identity).context
    }
catch{
        Write-Output "There is no system-assigned user identity. Aborting."; 
        exit
    }

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
    -DefaultProfile $AzureContext

if ($method -eq "SA")
    {
        Write-Output "Using system-assigned managed identity"
    }
elseif ($method -eq "UA")
    {
        Write-Output "Using user-assigned managed identity"

        # Connects using the Managed Service Identity of the named user-assigned managed identity
        $identity = Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup `
            -Name $UAMI -DefaultProfile $AzureContext

        # validates assignment only, not perms
        if ((Get-AzAutomationAccount -ResourceGroupName $resourceGroup `
                -Name $automationAccount `
                -DefaultProfile $AzureContext).Identity.UserAssignedIdentities.Values.PrincipalId.Contains($identity.PrincipalId))
            {
                $AzureContext = (Connect-AzAccount -Identity -AccountId $identity.ClientId).context

                # set and store context
                $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
            }
        else {
                Write-Output "Invalid or unassigned user-assigned managed identity"
                exit
            }
    }
else {
        Write-Output "Invalid method. Choose UA or SA."
        exit
     }

# Get current state of VM
$status = (Get-AzVM -ResourceGroupName $resourceGroup -Name $VMName `
    -Status -DefaultProfile $AzureContext).Statuses[1].Code

Write-Output "`r`n Beginning VM status: $status `r`n"

# Start or stop VM based on current state
if($status -eq "Powerstate/deallocated")
    {
        Start-AzVM -Name $VMName -ResourceGroupName $resourceGroup -DefaultProfile $AzureContext
    }
elseif ($status -eq "Powerstate/running")
    {
        Stop-AzVM -Name $VMName -ResourceGroupName $resourceGroup -DefaultProfile $AzureContext -Force
    }

# Get new state of VM
$status = (Get-AzVM -ResourceGroupName $resourceGroup -Name $VMName -Status `
    -DefaultProfile $AzureContext).Statuses[1].Code  

Write-Output "`r`n Ending VM status: $status `r`n `r`n"

Write-Output "Account ID of current context: " $AzureContext.Account.Id

我们已经在本地环境中测试过它工作正常,以下陈述基于分析。

在我们的本地环境中,我们创建了一个 Powershell runbook 运行 不同的 PowerShell 版本 7.1 和版本 5.1。

  • 使用上述共享脚本和 webhook URI,当我们尝试使用 `Invoke-webRequest 方法调用 runbook(PowerShell 7.1 版)时,它不断失败。

或者,我们尝试使用运行良好的Invoke-webRequest方法调用运行手册(PowerShell 5.1 版)。

我们建议您在 Runbook 中使用 Powershell 版本 5.1 而不是 7.1。

这里是示例输出以供参考: