Alternância de contexto na Automatização do Azure
A alternância de contexto ocorre quando o contexto num processo altera o contexto num processo diferente. Um contexto do Azure é um conjunto de informações que define o destino dos cmdlets do Azure PowerShell. O contexto consiste nas seguintes propriedades:
Property | Descrição |
---|---|
Name | O nome do contexto. |
Account | O nome de usuário ou entidade de serviço usada para autenticar comunicações com o Azure. |
Environment | Representa o Azure global ou uma das nuvens nacionais do Azure, como o Azure Government. Você também pode especificar uma plataforma de nuvem híbrida, como o Azure Stack. |
Subscrição | Representa a assinatura do Azure que contém os recursos que você deseja gerenciar. |
Inquilino | Uma instância dedicada e confiável do Microsoft Entra ID que representa uma única organização. |
Credenciais | As informações utilizadas pelo Azure para verificar a sua identidade e confirmar a sua autorização para aceder a recursos no Azure. |
Quando uma conta inicia sessão e consegue aceder a várias subscrições, qualquer uma dessas subscrições pode ser adicionada ao contexto do utilizador. Para garantir a subscrição correta, tem de declará-la ao ligar-se. Por exemplo, use Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
. No entanto, problemas podem surgir quando seus runbooks gerenciando uma assinatura são executados no mesmo processo de área restrita que seus outros runbooks gerenciando recursos em outra assinatura da mesma conta de automação. As alterações ao contexto feitas por um runbook podem afetar outros runbooks que estão a utilizar o contexto predefinido. Como o contexto inclui informações, como as credenciais a serem usadas e a assinatura de destino, os cmdlets podem direcionar a assinatura errada resultando em erros ou not found
permissões. Esse problema é conhecido como Alternância de contexto.
Gerenciar contextos do Azure
Para evitar que seus runbooks sejam executados contra recursos na assinatura errada, revise as seguintes recomendações:
- Desative o salvamento de contexto de área restrita em seu runbook de automação usando o seguinte comando no início de cada runbook:
Disable-AzContextAutosave -Scope Process
. - Os cmdlets do Azure PowerShell suportam o parâmetro
-DefaultProfile
. Esse parâmetro foi adicionado a todos os cmdlets Az e Azure Resource Manager (AzureRM) para dar suporte à execução de vários scripts no mesmo processo, permitindo que você especifique para cada cmdlet qual contexto usar. Guarde o objeto de contexto no runbook quando for criado e sempre que for alterado. Em seguida, faça referência ao mesmo em todas as chamadas feitas com o cmdlet 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 trecho de código de runbook do PowerShell usando uma identidade gerenciada atribuída ao sistema seguindo as recomendações para evitar a troca 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
Possíveis sintomas
Embora você possa não se deparar com um problema se não seguir essas recomendações, a oportunidade existe. A questão subjacente a esta situação é o calendário; depende do que cada runbook está fazendo no momento em que o outro runbook muda de contexto. Aqui estão algumas mensagens de erro possíveis. No entanto, essas mensagens de erro podem ser causadas por condições de comutação 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/<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