Azure 自动化作业共享订阅上下文

Azure Automation jobs sharing subscription context

我有一个 Azure 自动化运行手册,它为每个订阅启动一个 child 运行手册。

foreach ($sub in $subscriptions)
{
    $ChildRunbookInputParams = @{"SubscriptionId"="$($sub.SubscriptionId)"}

    $job = Start-AzureRmAutomationRunbook `
            -Name $ChildRunbookName `
            -Parameters $ChildRunbookInputParams `
            -ResourceGroupName $AutomationAccountResourceGroup `
            -AutomationAccountName $AutomationAccountName 
}

parent 和 child 运行手册都使用相同的 run-as 帐户。

我 运行 遇到的问题是 Runbook 似乎在共享上下文,即使它们 运行 作为独立作业也是如此。
parent runbook 对包含自动化帐户的订阅执行 Set-AzureRmContext,以便它可以 Start-AzureRmAutomationRunbook。 child runbook 对传递给它的订阅 ID 执行 Set-AzureRmContext,以便它可以处理该订阅中的资源。
在第一个 child runbook 启动后,parent runbook 中的后续 Start-AzureRmAutomationRunbook 调用失败,因为它无法再找到指定的 runbook。随着其他 child runbook 的启动(parent runbook 在第一个更改订阅之前启动了多个 child 作业),先前启动的 child 作业开始处理资源最后订阅。

这是预期的行为吗?使用多个订阅似乎是一个常见的需求;推荐的模式是什么?

我们 运行 也遇到了这个问题,不得不向 Microsoft 提出支持案例来解决。自 2017 年 9 月以来,这可能才有可能,因为 Azure PowerShell modules/cmdlets 开始支持配置文件(AzureRM 上下文)中的能力传递作为参数;这确保 AzureRM 命令 运行 并行——通过工作流或通过使用 Start-AzureRMAutoRunbookJob 启动新的子自动化作业——针对指定的上下文执行。

这个问题的原因是因为使用 Azure 管理的自动化工作器,在高作业量下,Azure 重用工作器以节省资源,上下文可能会丢失。

GitHub (https://github.com/jefffanjoy/DemoCode/tree/master/Runbooks/Azure%20Automation)

上提供了此示例