Бөлісу құралы:


Переключение контекста в службе автоматизации 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 в неправильной подписке, ознакомьтесь со следующими рекомендациями:

  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

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