Share via


Azure Automation에서 컨텍스트 전환

컨텍스트 전환은 한 프로세스의 컨텍스트가 다른 프로세스의 컨텍스트를 변경하는 경우입니다. Azure 컨텍스트는 Azure PowerShell cmdlet의 대상을 정의하는 정보 집합입니다. 컨텍스트는 다음 속성으로 구성됩니다.

속성 설명
이름 컨텍스트의 이름입니다.
어카운트 Azure와의 통신을 인증하는 데 사용되는 사용자 이름 또는 서비스 주체입니다.
환경 Azure 글로벌 또는 국가별 Azure 클라우드 중 하나(예: Azure Government)를 나타냅니다. Azure Stack과 같은 하이브리드 클라우드 플랫폼을 지정할 수도 있습니다.
구독 관리하려는 리소스가 포함된 Azure 구독을 나타냅니다.
테넌트 단일 조직을 나타내는 Microsoft Entra ID의 신뢰할 수 있는 전용 인스턴스입니다.
자격 증명 Azure에서 사용자 ID를 확인하고 Azure의 리소스에 액세스하기 위한 사용자의 권한 부여를 확인하는 데 사용되는 정보입니다.

여러 구독에 액세스할 수 있는 계정이 로그인하면 해당 구독이 사용자의 컨텍스트에 추가될 수 있습니다. 올바른 구독을 보장하려면 연결할 때 선언해야 합니다. 예를 들면 Add-AzAccount -Credential $Cred -subscription 'cd4dxxxx-xxxx-xxxx-xxxx-xxxxxxxx9749'를 사용합니다. 그러나 한 구독을 관리하는 Runbook이 동일한 Automation 계정의 다른 구독에서 리소스를 관리하는 다른 Runbook과 동일한 샌드박스 프로세스에서 실행되는 경우 문제가 발생할 수 있습니다. 한 Runbook에서 컨텍스트를 변경하면 기본 컨텍스트를 사용하는 다른 Runbook에 영향을 줄 수 있습니다. 컨텍스트에는 사용할 자격 증명 및 대상 구독과 같은 정보가 포함되어 있으므로 cmdlet이 잘못된 구독을 대상으로 하여 not found 또는 사용 권한 오류가 발생할 수 있습니다. 이 문제를 컨텍스트 전환이라고 합니다.

Azure 컨텍스트 관리

Runbook이 잘못된 구독의 리소스에 대해 실행되는 것을 방지하려면 다음 권장 사항을 검토합니다.

  1. 각 Runbook의 시작 부분에 Disable-AzContextAutosave -Scope Process 명령을 사용하여 Automation Runbook 내에서 샌드박스 컨텍스트 저장을 사용하지 않도록 설정합니다.
  2. Azure PowerShell cmdlet은 -DefaultProfile 매개 변수를 지원합니다. 이 매개 변수는 동일한 프로세스에서 여러 스크립트 실행을 지원하기 위해 모든 Az 및 AzureRM(Azure Resource Manager) cmdlet에 추가되므로 각 cmdlet에 사용할 컨텍스트를 지정할 수 있습니다. 컨텍스트 개체가 만들어지고 변경될 때마다 Runbook에 저장합니다. 그런 다음, Az 또는 AzureRM cmdlet을 사용하여 수행한 모든 호출에서 참조합니다. 예: $AzureContext = Set-AzContext -SubscriptionId $subID.
  3. 컨텍스트 개체를 PowerShell cmdlet에 전달합니다(예: Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext).

다음은 컨텍스트 전환을 방지하기 위한 권장 사항에 따라 시스템 할당 관리 ID를 사용하는 PowerShell Runbook 코드 조각입니다.

# 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

가능한 증상

이러한 권장 사항을 따르지 않으면 문제가 발생하지 않을 수 있지만 기회가 있습니다. 이 상황의 근본적인 문제는 타이밍입니다. 다른 Runbook이 컨텍스트를 전환할 때 각 Runbook이 수행하는 작업에 따라 달라집니다. 다음은 몇 가지 가능한 오류 메시지입니다. 그러나 이러한 오류 메시지는 비컨텍스트 전환 조건으로 인해 발생할 수 있습니다.

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

다음 단계