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í:
- 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
- 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
. - Předejte kontextový objekt rutině PowerShellu,
Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext
napří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