Sdílet prostřednictvím


Přepínání kontextu ve službě Azure Automation

Přepínání kontextu spočívá v tom, že kontext v jednom procesu změní kontext v jiném procesu. Kontext Azure je soubor informací, který definuje cíl rutin Azure PowerShellu. Kontext se skládá z následujících vlastností:

Vlastnost Popis
Name Název kontextu.
Obchodní vztah Uživatelské jméno nebo instanční objekt použitý k ověřování komunikace s Azure.
Prostředí Představuje globální azure nebo jeden z národních cloudů Azure, jako je Azure Government. Můžete také zadat hybridní cloudovou platformu, jako je Azure Stack.
Předplatné Představuje předplatné Azure, které obsahuje prostředky, které chcete spravovat.
Tenant Vyhrazená a důvěryhodná instance ID Microsoft Entra, která představuje jednu organizaci.
Přihlašovací údaje Informace používané Azure k ověření vaší identity a potvrzení autorizace pro přístup k prostředkům v Azure.

Pokud se přihlásí účet, který má přístup k několika odběrům, může být do kontextu uživatele přidán kterýkoli z těchto odběrů. Aby bylo zaručeno správné přihlášení k odběru, je třeba jej nahlásit při připojení. Například použijte Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'. K problémům ale může dojít v případě, že runbooky spravující jedno předplatné běží ve stejném procesu sandboxu jako ostatní runbooky spravující prostředky v jiném předplatném ze stejného účtu Automation. Změny kontextu provedené jedním runbookem můžou ovlivnit další runbooky, které využívají výchozí kontext. Vzhledem k tomu, že kontext obsahuje informace, jako jsou přihlašovací údaje pro použití a předplatné k cíli, můžou rutiny cílit na nesprávné předplatné, což vede k not found chybám oprávnění nebo chybám oprávnění. Tento problém se označuje jako přepínání kontextu.

Správa kontextů Azure

Pokud se chcete vyhnout spouštění runbooků s prostředky v nesprávném předplatném, projděte si následující doporučení:

  1. Zakažte ukládání kontextu sandboxu v rámci runbooku Automation pomocí následujícího příkazu na začátku každého runbooku: Disable-AzContextAutosave -Scope Process
  2. Rutiny Azure PowerShellu podporují parametr -DefaultProfile. Tento parametr byl přidán do všech rutin Az a Azure Resource Manageru (AzureRM) pro podporu spouštění více skriptů ve stejném procesu, což umožňuje zadat pro každou rutinu, která se má použít. Uložte kontextový objekt do runbooku při jeho vytvoření a pokaždé, když se změní. Pak na něho můžete odkazovat v každém volání pomocí rutiny Az nebo AzureRM. Například $AzureContext = Set-AzContext -SubscriptionId $subID.
  3. Předejte kontextový objekt rutině PowerShellu, Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContextnapříklad .

Tady je fragment kódu runbooku PowerShellu s využitím spravované identity přiřazené systémem podle doporučení, abyste se vyhnuli přepínání kontextu.

# 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

Možné příznaky

I když se vám nemusí vyskytnout problém, pokud tato doporučení nedodržíte, tato příležitost existuje. Základním problémem s touto situací je načasování; závisí na tom, co každý runbook dělá v době, kdy druhý runbook přepne svůj kontext. Tady je několik možných chybových zpráv. Tyto chybové zprávy však můžou být způsobeny podmínkami přepínání mimo kontext.

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/<subscriptionIdOfSubscriptionWhichDoesntContainTheVM>/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

Další kroky