Переключение контекста в службе автоматизации Azure
Переключение контекста — это когда контекст в одном процессе меняет контекст в другом. Контекст Azure — это набор сведений, которые определяют целевой объект для командлетов Azure PowerShell. Контекст состоит из следующих свойств:
Свойство | Описание |
---|---|
Имя. | Имя контекста. |
Учетная запись | Имя пользователя или субъект-служба, используемые для проверки подлинности связи с Azure. |
Среда | Представляет глобальный или один из национальных облаков Azure, например Azure для государственных организаций. Вы также можете указать гибридную облачную платформу, например Azure Stack. |
Отток подписок | Представляет подписку Azure, содержащую ресурсы, которым требуется управлять. |
Клиент | Выделенный и доверенный экземпляр идентификатора Microsoft Entra, представляющий одну организацию. |
Подтверждение компетенции | Сведения, используемые Azure для проверки удостоверения и подтверждения авторизации для доступа к ресурсам в Azure. |
Если при входе в систему учетная запись получает доступ к нескольким подпискам, любая из них может быть добавлена в контекст пользователя. Чтобы гарантировать выбор правильной подписки, необходимо объявить ее при подключении. Например, укажите Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
. Однако проблемы могут возникнуть, когда модули Runbook управляют одной подпиской в том же процессе песочницы, что и другие модули Runbook, управляющие ресурсами в другой подписке из той же учетной записи службы автоматизации. Это означает, что изменения в контексте, внесенные одним модулем runbook, могут повлиять на другие модулиrunbook, использующие контекст по умолчанию. В контексте содержатся сведения, такие как учетные данные, используемые и подписка для целевого объекта, командлеты могут нацеливать на неправильную подписку, что приводит к not found
ошибкам разрешений. Эта проблема называется переключением контекста.
Управление контекстами Azure
Чтобы избежать запуска модулей Runbook в неправильной подписке, ознакомьтесь со следующими рекомендациями:
- Отключите сохранение контекста песочницы в runbook службы автоматизации с помощью следующей команды в начале каждого модуля Runbook:
Disable-AzContextAutosave -Scope Process
- Командлеты Azure PowerShell поддерживают параметр
-DefaultProfile
. Этот параметр был добавлен ко всем командлетам Az и Azure Resource Manager (AzureRM) для поддержки выполнения нескольких сценариев в одном процессе, что позволяет указать для каждого командлета, который будет использоваться контекстом. Сохраните объект контекста в модуле runbook при его создании и каждом изменении. Затем ссылайтесь на него в каждом вызове командлета Az или AzureRM. Например,$AzureContext = Set-AzContext -SubscriptionId $subID
. - Передайте объект контекста командлету 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