Przełączanie kontekstu w usłudze Azure Automation
O przełączaniu kontekstu mówimy wówczas, gdy kontekst w jednym procesie zmienia kontekst w innym procesie. Kontekst platformy Azure to zestaw informacji, który definiuje cel poleceń cmdlet programu Azure PowerShell. Kontekst składa się z następujących właściwości:
Właściwości | Opis |
---|---|
Nazwa/nazwisko | Nazwa kontekstu. |
Klient | Nazwa użytkownika lub jednostka usługi używana do uwierzytelniania komunikacji z platformą Azure. |
Środowisko | Reprezentuje platformę Azure globalną lub jedną z krajowych chmur platformy Azure, takich jak Azure Government. Możesz również określić hybrydową platformę w chmurze, na przykład Azure Stack. |
Subskrypcja | Reprezentuje subskrypcję platformy Azure zawierającą zasoby, którymi chcesz zarządzać. |
Dzierżawa | Dedykowane i zaufane wystąpienie identyfikatora Entra firmy Microsoft, które reprezentuje jedną organizację. |
Referencja | Informacje używane przez platformę Azure do weryfikowania tożsamości i potwierdzania autoryzacji dostępu do zasobów na platformie Azure. |
Po zalogowaniu się konta, które może uzyskać dostęp do kilku subskrypcji, każda z tych subskrypcji może zostać dodana do kontekstu użytkownika. Aby zagwarantować poprawną subskrypcję, należy ją zadeklarować podczas nawiązywania połączenia. Użyj na przykład nazwy Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
. Mogą jednak wystąpić problemy, gdy elementy Runbook zarządzające jedną subskrypcją są uruchamiane w tym samym procesie piaskownicy co inne elementy Runbook zarządzające zasobami w innej subskrypcji z tego samego konta usługi Automation. Zmiany kontekstu wprowadzone przez jeden element runbook mogą mieć wpływ na inne elementy runbook używające kontekstu domyślnego. Ponieważ kontekst zawiera informacje, takie jak poświadczenia do użycia i subskrypcja docelowa, polecenia cmdlet mogą dotyczyć nieprawidłowej subskrypcji, co powoduje not found
błędy uprawnień lub. Ten problem jest znany jako przełączanie kontekstu.
Zarządzanie kontekstami platformy Azure
Aby uniknąć uruchamiania elementów Runbook względem zasobów w niewłaściwej subskrypcji, zapoznaj się z następującymi zaleceniami:
- Wyłącz zapisywanie kontekstu piaskownicy w elemecie Runbook usługi Automation przy użyciu następującego polecenia na początku każdego elementu Runbook:
Disable-AzContextAutosave -Scope Process
. - Polecenia cmdlet programu Azure PowerShell obsługują parametr
-DefaultProfile
. Ten parametr został dodany do wszystkich poleceń cmdlet Az i Azure Resource Manager (AzureRM), aby obsługiwać uruchamianie wielu skryptów w tym samym procesie, co pozwala określić dla każdego polecenia cmdlet, które kontekst ma być używany. Zapisz obiekt kontekstu w elemecie runbook podczas jego tworzenia i za każdym razem, gdy zostanie zmieniony. Następnie odwołaj się do niego w każdym wywołaniu wykonanym za pomocą polecenia cmdlet Az lub AzureRM. Na przykład$AzureContext = Set-AzContext -SubscriptionId $subID
. - Przekaż obiekt kontekstu do polecenia cmdlet programu PowerShell, na przykład
Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext
.
Oto fragment kodu elementu Runbook programu PowerShell przy użyciu tożsamości zarządzanej przypisanej przez system zgodnie z zaleceniami, aby uniknąć przełączania kontekstu.
# 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żliwe objawy
Chociaż nie możesz napotkać problemu, jeśli nie zastosujesz się do tych zaleceń, szansa sprzedaży istnieje. Podstawowym problemem z tą sytuacją jest czas; Zależy to od tego, co każdy element Runbook wykonuje w czasie, gdy drugi element Runbook przełącza jego kontekst. Poniżej przedstawiono niektóre możliwe komunikaty o błędach. Jednak te komunikaty o błędach mogą być spowodowane przez warunki przełączania niezwiązane z kontekstem.
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