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
Namn Namnet på kontexten.
Account Användarnamnet eller tjänstens huvudnamn som används för att autentisera kommunikationen med Azure.
Miljö 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.
Autentiseringsuppgifter 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 'cd4dxxxx-xxxx-xxxx-xxxx-xxxxxxxx9749'. 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. Ändringar i kontexten som görs av en runbook kan påverka dina andra runbooks med hjälp av 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:

  1. 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.
  2. Azure PowerShell-cmdletarna stöder parametern -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 Az- eller AzureRM-cmdleten. Till exempel $AzureContext = Set-AzContext -SubscriptionId $subID.
  3. Skicka kontextobjektet till PowerShell-cmdleten, Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContexttill 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

Nästa steg