Alternância de contexto na Automação do Azure
A alternância de contexto é quando o contexto em um processo altera o contexto em um processo diferente. Um contexto do Azure é um conjunto de informações que define o destino de cmdlets do Azure PowerShell. O contexto consiste nas seguintes propriedades:
Propriedade | Descrição |
---|---|
Nome | O nome do contexto. |
Conta | A entidade de serviço ou o nome de usuário usado para autenticar a comunicação com o Azure. |
Ambiente | Representa o Azure global ou uma das nuvens nacionais do Azure, como o Azure Governamental. Você também pode especificar uma plataforma de nuvem híbrida, como o Azure Stack. |
Assinatura | Representa a assinatura do Azure que contém os recursos que você deseja gerenciar. |
Locatário | Uma instância dedicada e confiável do Microsoft Entra ID que representa uma única organização. |
Credenciais | As informações usadas pelo Azure para verificar sua identidade e confirmar sua autorização para acessar recursos no Azure. |
Quando uma conta é acessada e pode acessar várias assinaturas, qualquer uma dessas assinaturas pode ser adicionada ao contexto do usuário. Para garantir a assinatura correta, você deve declará-la ao se conectar. Por exemplo, use Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
. No entanto, podem surgir problemas quando seus runbooks que gerenciam uma assinatura são executados no mesmo processo de área restrita que seus outros runbooks que estão gerenciando recursos em outra assinatura da mesma conta de Automação. As alterações no contexto feitas por um runbook podem afetar seus outros runbooks usando o contexto padrão. Como o contexto inclui informações, como as credenciais a usar e a assinatura para o destino, os cmdlets podem direcionar a assinatura errada resultando em erros de permissão ou not found
. Esse problema é conhecido como Alternância de contexto.
Gerenciar contextos do Azure
Para evitar que seus runbooks executem em recursos na assinatura errada, revise as seguintes recomendações:
- Desabilite a economia de contexto de área restrita salvando em seu runbook de automação com o uso do seguinte comando no início de cada runbook:
Disable-AzContextAutosave -Scope Process
. - Os cmdlets Azure PowerShell dão suporte ao
-DefaultProfile
parâmetro. Esse parâmetro foi adicionado a todos os cmdlets do Az e do Azure Resource Manager para dar suporte à execução de vários scripts no mesmo processo, permitindo que você especifique que contexto usar para cada cmdlet. Salve o objeto de contexto em seu runbook quando ele for criado e sempre que ele for alterado. Em seguida, consulte-o em cada chamada feita com o cmdlet do Az ou do AzureRM. Por exemplo,$AzureContext = Set-AzContext -SubscriptionId $subID
. - Passe o objeto de contexto para o cmdlet do PowerShell, por exemplo,
Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext
.
Aqui está um snippet de código de runbook do PowerShell usando uma identidade gerenciada atribuída pelo sistema seguindo as recomendações para evitar a alternância de contexto.
# 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
Sintomas possíveis
Embora você não tenha problemas se não seguir essas recomendações, a oportunidade existe. O problema subjacente com essa situação é o tempo; depende do que cada runbook está fazendo no momento em que o outro runbook alterna seu contexto. Aqui estão algumas mensagens de erro: No entanto, essas mensagens de erro podem ser causadas por condições de alternância sem contexto.
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