Cambio di contesto in Automazione di Azure

Il cambio di contesto avviene quando il contesto di un processo cambia il contesto di un altro processo. Un contesto Azure è un set di informazioni che definisce la destinazione dei cmdlet di Azure PowerShell. Il contesto è costituito dalle seguenti proprietà:

Proprietà Descrizione
Name Il nome del contesto.
Conto Nome utente o entità servizio utilizzata per autenticare le comunicazioni con Azure.
Ambiente Rappresenta il Azure globale o uno dei cloud nazionali Azure, ad esempio Azure per enti pubblici. È anche possibile specificare una piattaforma cloud ibrida, ad esempio Azure Stack.
Abbonamento Rappresenta la sottoscrizione Azure che contiene le risorse da gestire.
Tenant Istanza dedicata e attendibile di Microsoft Entra ID che rappresenta una singola organizzazione.
Credenziali Le informazioni usate da Azure per verificare l'identità e confermare l'autorizzazione ad accedere alle risorse in Azure.

Quando un account accede a più sottoscrizioni, è possibile aggiungere una di queste sottoscrizioni al contesto dell'utente. Per garantire la sottoscrizione corretta, è necessario dichiararla durante la connessione. Ad esempio, usare Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'. Tuttavia, possono insorgere problemi quando i runbook che gestiscono una sottoscrizione vengono eseguiti nello stesso processo della sandbox degli altri runbook che gestiscono risorse in un'altra sottoscrizione dallo stesso account di Automazione. Questo significa che le modifiche al contesto apportate da un runbook possono influire sugli altri runbook che usano il contesto predefinito. Poiché il contesto include informazioni quali le credenziali da usare e la sottoscrizione di destinazione, i cmdlet potrebbero avere come destinazione la sottoscrizione errata e causare errori di not found o di autorizzazione. Questo problema è noto come Cambio di contesto.

Gestire i contesti di Azure

Per evitare che i runbook vengano eseguiti su risorse nella sottoscrizione sbagliata, esaminare le seguenti raccomandazioni:

  1. Disabilitare il salvataggio del contesto della sandbox all'interno dei runbook di Automazione usando il comando seguente all'inizio di ogni runbook: Disable-AzContextAutosave -Scope Process.
  2. I cmdlet Azure PowerShell supportano il parametro -DefaultProfile. Questo parametro è stato aggiunto a tutti i cmdlet Az e Azure Resource Manager (AzureRM) per supportare l'esecuzione di più script nello stesso processo, consentendo di specificare quale contesto utilizzare per ciascun cmdlet. Salvare l'oggetto di contesto nel runbook quando viene creato e ogni volta che viene modificato. Quindi farvi riferimento in ogni chiamata effettuata con il cmdlet Az o AzureRM. Ad esempio: $AzureContext = Set-AzContext -SubscriptionId $subID.
  3. Passare l'oggetto del contesto al cmdlet PowerShell, ad esempio Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext.

Segue un frammento di codice del runbook PowerShell che utilizza un'identità gestita assegnata dal sistema, seguendo le raccomandazioni per evitare il cambio di contesto.

# 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

Possibili sintomi

Anche se potresti non incontrare un problema se non segui queste raccomandazioni, c'è comunque la possibilità che accada. Il problema sottostante questa situazione è correlato al tempismo; dipende da cosa sta facendo ogni runbook nel momento in cui l'altro runbook cambia contesto. Di seguito sono riportati alcuni possibili messaggi di errore. Tuttavia, questi messaggi di errore possono essere causati da condizioni non correlate al cambio di contesto.

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

Passaggi successivi