Переключение контекста в службе автоматизации Azure

Переключение контекста заключается в том, что контекст в одном процессе изменяет контекст в другом процессе. Контекст Azure — это набор сведений, которые определяют целевой объект для командлетов Azure PowerShell. Контекст состоит из следующих свойств:

Свойство Описание
Имя. Имя контекста.
Организация Имя пользователя или субъект-служба, используемые для проверки подлинности связи с Azure.
Среда Представляет глобальный или один из национальных облаков Azure, например Azure для государственных организаций. Вы также можете указать гибридную облачную платформу, например Azure Stack.
Подписка Представляет подписку Azure, содержащую ресурсы, которым требуется управлять.
Клиент Выделенный и доверенный экземпляр идентификатора Microsoft Entra, представляющий одну организацию.
Учетные данные Сведения, используемые Azure для проверки удостоверения и подтверждения авторизации для доступа к ресурсам в Azure.

Если учетная запись входит в систему с доступом к нескольким подпискам, в контекст пользователя может быть добавлена любая из этих подписок. Чтобы гарантировать правильную подписку, необходимо объявить ее при подключении. Например, укажите Add-AzAccount -Credential $Cred -subscription 'cd4dxxxx-xxxx-xxxx-xxxx-xxxxxxxx9749'. Однако проблемы могут возникнуть, когда модули Runbook управляют одной подпиской в том же процессе песочницы, что и другие модули Runbook, управляющие ресурсами в другой подписке из той же учетной записи службы автоматизации. Изменения контекста, внесенные одним модуном модуном модумом Runbook, могут повлиять на другие модули Runbook с помощью контекста по умолчанию. В контексте содержатся сведения, такие как учетные данные, используемые и подписка для целевого объекта, командлеты могут нацеливать на неправильную подписку, что приводит к not found ошибкам разрешений. Эта проблема называется переключением контекста.

Управление контекстами Azure

Чтобы избежать запуска модулей Runbook в неправильной подписке, ознакомьтесь со следующими рекомендациями:

  1. Отключите сохранение контекста песочницы в runbook службы автоматизации с помощью следующей команды в начале каждого модуля Runbook: Disable-AzContextAutosave -Scope Process
  2. Командлеты Azure PowerShell поддерживают параметр -DefaultProfile. Этот параметр был добавлен ко всем командлетам Az и Azure Resource Manager (AzureRM) для поддержки выполнения нескольких сценариев в одном процессе, что позволяет указать для каждого командлета, который будет использоваться контекстом. Сохраните объект контекста в runbook при его создании и при каждом изменении. Затем сослаться на него во всех вызовах с помощью командлета Az или AzureRM. Например, $AzureContext = Set-AzContext -SubscriptionId $subID.
  3. Передайте объект контекста командлету PowerShell, например Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext.

Ниже приведен фрагмент кода Runbook PowerShell с помощью управляемого удостоверения, назначаемого системой, следуя рекомендациям, чтобы избежать переключения контекста.

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

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

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

# Pass context object - even though the context had just been set
# This is the step that guarantees the context will not be switched.
Get-AzVM -ResourceGroupName "resourceGroupName" -DefaultProfile $AzureContext | Select Name

Возможные симптомы

Хотя вы не можете столкнуться с проблемой, если вы не следуйте этим рекомендациям, эта возможность существует. Основная проблема с этой ситуацией — это время; Он зависит от того, что выполняет каждый модуль Runbook в то время, когда другой модуль Runbook переключает его контекст. Ниже приведены некоторые возможные сообщения об ошибках. Однако эти сообщения об ошибках могут быть вызваны условиями переключения вне контекста.

The subscription named <subscription name> cannot be found.

Get-AzVM : The client '<clientid>' with object id '<objectid>' does not have authorization to perform action 'Microsoft.Compute/virtualMachines/read' over scope '/subscriptions/<subcriptionIdOfSubscriptionWichDoesntContainTheVM>/resourceGroups/REsourceGroupName/providers/Microsoft.Compute/virtualMachines/VMName '.
   ErrorCode: AuthorizationFailed
   StatusCode: 403
   ReasonPhrase: Forbidden Operation
   ID : <AGuidRepresentingTheOperation> At line:51 char:7 + $vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $UNBV... +
Get-AzureRmResource : Resource group "SomeResourceGroupName" could not be found.
... resources = Get-AzResource -ResourceGroupName $group.ResourceGro ...
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-AzResource], CloudException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResourceCmdlet

Следующие шаги