Pengalihan konteks di Azure Automation

Pengalihan konteks adalah ketika konteks dalam satu proses mengubah konteks dalam proses yang berbeda. Konteks Azure adalah kumpulan informasi yang menentukan target cmdlet Azure PowerShell. Konteks terdiri dari properti berikut:

Properti Deskripsi
Nama Nama konteks.
Akun Nama pengguna atau perwakilan layanan yang digunakan untuk mengautentikasi komunikasi dengan Azure.
Lingkungan Mewakili Azure global atau salah satu cloud Azure nasional, seperti Azure Government. Anda juga dapat menentukan platform cloud hibrid, seperti Azure Stack.
Langganan Mewakili langganan Azure yang berisi sumber daya yang ingin Anda kelola.
Penyewa Instans khusus dan tepercaya DARI ID Microsoft Entra yang mewakili satu organisasi.
Kredensial Informasi yang digunakan oleh Azure untuk memverifikasi identitas dan mengonfirmasi otorisasi Anda untuk mengakses sumber daya di Azure.

Saat akun masuk yang dapat mengakses beberapa langganan, salah satu langganan tersebut dapat ditambahkan ke konteks pengguna. Untuk menjamin langganan yang benar, Anda harus mendeklarasikannya saat menyambungkan. Misalnya, gunakan Add-AzAccount -Credential $Cred -subscription 'cd4dxxxx-xxxx-xxxx-xxxx-xxxxxxxx9749'. Tetapi, masalah dapat muncul saat runbook Anda yang mengelola satu langganan berjalan dalam proses kotak pasir yang sama seperti runbook yang lain yang mengelola sumber daya di langganan lain dari akun Automation yang sama. Perubahan pada konteks yang dibuat oleh satu runbook dapat memengaruhi runbook Anda yang lain yang menggunakan konteks default. Karena konteks mencakup informasi, seperti info masuk yang akan digunakan dan langganan yang ditargetkan, cmdlet dapat menargetkan langganan yang salah yang mengakibatkan not found atau kesalahan izin. Masalah ini dikenal sebagai Pengalihan Konteks.

Kelola konteks Azure

Untuk menghindari runbook Anda berjalan di sumber daya dalam langganan yang salah, tinjau rekomendasi berikut:

  1. Nonaktifkan penyimpanan konteks kotak pasir dalam runbook Automation Anda dengan menggunakan perintah berikut di awal setiap runbook: Disable-AzContextAutosave -Scope Process.
  2. Cmdlet Azure PowerShell mendukung parameter -DefaultProfile. Parameter ini ditambahkan ke semua cmdlet Az dan Azure Resource Manager (AzureRM) untuk mendukung menjalankan beberapa skrip dalam proses yang sama, memungkinkan Anda menentukan untuk setiap cmdlet tentang konteks mana yang akan digunakan. Simpan objek konteks Anda di runbook saat dibuat dan setiap kali diubah. Kemudian referensikan di setiap panggilan yang dilakukan dengan cmdlet Az atau AzureRM. Contohnya, $AzureContext = Set-AzContext -SubscriptionId $subID.
  3. Teruskan objek konteks ke cmdlet PowerShell, misalnya, Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext.

Berikut ini cuplikan kode runbook PowerShell menggunakan identitas terkelola yang ditetapkan sistem dengan mengikuti rekomendasi untuk menghindari pengalihan konteks.

# 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

Kemungkinan gejala

Meskipun Anda mungkin tidak menemukan masalah jika tidak mengikuti rekomendasi ini, peluang terjadinya masalah memang ada. Masalah mendasar dengan situasi ini adalah waktu; hal ini tergantung pada apa yang dilakukan setiap runbook pada saat runbook lain mengalihkan konteksnya. Berikut adalah beberapa kemungkinan pesan kesalahan. Tetapi, pesan kesalahan ini dapat disebabkan oleh kondisi pengalihan non-konteks.

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

Langkah berikutnya