Kontextbyte i Azure Automation
Kontextväxling är när kontexten i en process ändrar kontexten i en annan process. En Azure-kontext är en informationsuppsättning som definierar målet för Azure PowerShell-cmdletar. Kontexten består av följande egenskaper:
Property | Beskrivning |
---|---|
Name | Namnet på kontexten. |
Konto | Användarnamnet eller tjänstens huvudnamn som används för att autentisera kommunikationen med Azure. |
Environment | Representerar Azure Global eller något av de nationella Azure-molnen, till exempel Azure Government. Du kan också ange en hybridmolnplattform, till exempel Azure Stack. |
Prenumeration | Representerar den Azure-prenumeration som innehåller de resurser som du vill hantera. |
Klientorganisation | En dedikerad och betrodd instans av Microsoft Entra ID som representerar en enda organisation. |
Merit | Den information som används av Azure för att verifiera din identitet och bekräfta din behörighet att komma åt resurser i Azure. |
När ett konto loggar in som kan komma åt flera prenumerationer kan någon av dessa prenumerationer läggas till i användarens kontext. För att garantera rätt prenumeration måste du deklarera den när du ansluter. Använd till exempel Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
. Problem kan dock uppstå när dina runbooks som hanterar en prenumeration körs i samma sandbox-process som dina andra runbooks som hanterar resurser i en annan prenumeration från samma Automation-konto. Om en runbook gör ändringar i kontexten kan det alltså påverka andra runbooks som använder standardkontexten. Eftersom kontexten innehåller information, till exempel de autentiseringsuppgifter som ska användas och prenumerationen som ska riktas, kan cmdletar rikta in sig på fel prenumeration som resulterar i not found
eller behörighetsfel. Det här problemet kallas kontextväxling.
Hantera Azure-kontexter
Om du vill undvika att dina runbooks körs mot resurser i fel prenumeration läser du följande rekommendationer:
- Inaktivera att sandbox-kontexten sparas i Automation-runbooken med hjälp av följande kommando i början av varje runbook:
Disable-AzContextAutosave -Scope Process
. - Azure PowerShell-cmdlet stöder parameter
-DefaultProfile
. Den här parametern lades till i alla Az- och Azure Resource Manager-cmdletar (AzureRM) för att stödja körning av flera skript i samma process, så att du kan ange för varje cmdlet vilken kontext som ska användas. Spara kontextobjektet i din runbook när det skapas och varje gång det ändras. Referera sedan till det i varje anrop som görs med en Az- eller AzureRM-cmdlet. Exempel:$AzureContext = Set-AzContext -SubscriptionId $subID
- Skicka kontextobjektet till PowerShell-cmdleten,
Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext
till exempel .
Här är ett PowerShell Runbook-kodfragment med hjälp av en systemtilldelad hanterad identitet enligt rekommendationerna för att undvika kontextväxling.
# 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
Möjliga symtom
Du kanske inte stöter på ett problem om du inte följer de här rekommendationerna, men möjligheten finns. Det underliggande problemet med den här situationen är tidsinställningen. det beror på vad varje runbook gör när den andra runbooken växlar sin kontext. Här följer några möjliga felmeddelanden. Dessa felmeddelanden kan dock orsakas av icke-kontextväxlingsvillkor.
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