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 Il nome utente o l'entità servizio usato per l'autenticazione delle comunicazioni con Azure.
Ambiente Rappresenta il cloud globale di Azure o uno dei cloud nazionali di Azure, come Azure per enti pubblici. È anche possibile specificare una piattaforma di cloud ibrido, come Azure Stack.
Abbonamento Rappresenta la sottoscrizione di Azure che contiene le risorse da gestire.
Tenant Un'istanza dedicata e affidabile di Microsoft Entra ID che rappresenta una singola organizzazione.
Credenziali Le informazioni usate da Azure per verificare l'identità dell'utente e la relativa 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 'cd4dxxxx-xxxx-xxxx-xxxx-xxxxxxxx9749'. 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 in risorse nella sottoscrizione sbagliata, rivedere le raccomandazioni seguenti:

  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 di 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 il contesto da usare 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 usa un'identità gestita assegnata dal sistema che segue le raccomandazioni per evitare un 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

Per quanto non sia certo, non seguendo queste raccomandazioni si potrebbero riscontrare dei problemi. 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/<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

Passaggi successivi