Contextwisseling in Azure Automation
Contextomschakeling is wanneer de context in één proces de context naar een ander proces omschakelt. Een Azure-context is een set gegevens die het doel van Azure PowerShell-cmdlets beschrijft. De context bestaat uit de volgende eigenschappen:
Eigenschappen | Beschrijving |
---|---|
Naam | De naam van de context. |
Rekening | De gebruikersnaam of service-principal die wordt gebruikt om communicatie met Azure te verifiëren. |
Omgeving | Vertegenwoordigt de globale Azure-cloud of een van de nationale Azure-clouds, zoals Azure Government. U kunt ook een hybride cloudplatform opgeven, zoals Azure Stack. |
Abonnement | Vertegenwoordigt het Azure-abonnement dat de resources bevat die u wilt beheren. |
Tenant | Een toegewezen en vertrouwd exemplaar van Microsoft Entra-id die één organisatie vertegenwoordigt. |
Referentie | De informatie die door Azure wordt gebruikt om uw identiteit te verifiëren en uw autorisatie te bevestigen voor toegang tot resources in Azure. |
Wanneer een account zich aanmeldt dat toegang heeft tot verschillende abonnementen, kan elk van deze abonnementen worden toegevoegd aan de context van de gebruiker. Als u het juiste abonnement wilt garanderen, moet u dit declareren wanneer u verbinding maakt. Gebruik bijvoorbeeld Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
. Er kunnen echter problemen optreden wanneer uw runbooks die één abonnement beheren, worden uitgevoerd in hetzelfde sandbox-proces als uw andere runbooks die resources beheren in een ander abonnement vanuit hetzelfde Automation-account. Wijzigingen in de context die door het ene runbook worden aangebracht, kunnen invloed hebben op andere runbooks die gebruikmaken van de standaardcontext. Aangezien de context informatie bevat, zoals de referenties die moeten worden gebruikt en het abonnement op doel, kunnen cmdlets zich richten op het verkeerde abonnement, wat resulteert in not found
of machtigingsfouten. Dit probleem wordt contextwisseling genoemd.
Azure-contexten beheren
Raadpleeg de volgende aanbevelingen om te voorkomen dat uw runbooks worden uitgevoerd op resources in het verkeerde abonnement:
- Schakel het opslaan van sandboxcontext in uw Automation-runbook uit met behulp van de volgende opdracht aan het begin van elk runbook:
Disable-AzContextAutosave -Scope Process
- De Azure PowerShell-cmdlets ondersteunen de parameter
-DefaultProfile
. Deze parameter is toegevoegd aan alle Az- en Azure Resource Manager-cmdlets (AzureRM) ter ondersteuning van het uitvoeren van meerdere scripts in hetzelfde proces, zodat u kunt opgeven voor elke cmdlet welke context moet worden gebruikt. Sla uw contextobject op in uw runbook wanneer het wordt gemaakt en telkens wanneer het wordt gewijzigd. Verwijs er vervolgens naar in elke aanroep met de Az- of AzureRM-cmdlet. Bijvoorbeeld:$AzureContext = Set-AzContext -SubscriptionId $subID
. - Geef het contextobject door aan de PowerShell-cmdlet, bijvoorbeeld
Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext
.
Hier volgt een PowerShell-runbookcodefragment met behulp van een door het systeem toegewezen beheerde identiteit volgens de aanbevelingen om contextwisselingen te voorkomen.
# 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
Mogelijke symptomen
Hoewel u mogelijk geen probleem tegenkomt als u deze aanbevelingen niet volgt, bestaat de kans wel. Het onderliggende probleem met deze situatie is timing; Het hangt af van wat elk runbook doet op het moment dat het andere runbook de context van het runbook overschakelt. Hier volgen enkele mogelijke foutberichten. Deze foutberichten kunnen echter worden veroorzaakt door niet-contextoverschakelingsvoorwaarden.
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