Bagikan melalui


Tutorial: Membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan dengan menggunakan Azure Functions

Berlaku untuk: ✔️ VM Windows ✔️ VM Linux ✔️ Lingkungan di lokasi ✔️ VM Azure ✔️ server Azure Arc.

Tutorial ini menjelaskan cara membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan untuk memulai dan menghentikan komputer virtual (VM) dalam alur kerja patch terjadwal dengan menggunakan Azure Functions.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Membuat aplikasi fungsi.
  • Buat fungsi.
  • Buat langganan acara.

Prasyarat

  1. Pastikan Anda menggunakan runbook PowerShell 7.4 .

  2. Tetapkan izin untuk identitas terkelola yang sesuai. Runbook dapat menggunakan identitas terkelola yang ditetapkan sistem pada akun Automation atau identitas terkelola yang ditetapkan pengguna.

    Contoh skrip berikut (memulai dan menghentikan VM) memerlukan peran Kontributor Komputer Virtual atau peran kustom dengan izin khusus ini:

    • Microsoft.Compute/virtualMachines/start/tindakan
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/mulai ulang/tindakan
    • Microsoft.Compute/virtualMachines/powerOff/action

    Anda dapat menggunakan cmdlet portal Microsoft Azure atau Azure PowerShell untuk menetapkan izin ke setiap identitas:

    Untuk menetapkan izin, ikuti langkah-langkah dalam Menetapkan peran Azure menggunakan portal Microsoft Azure.


  1. Impor modul Az.ResourceGraph. Pastikan bahwa modul diperbarui ke ThreadJob dengan modul versi 2.0.3.

Buat aplikasi fungsi

  1. Ikuti langkah-langkah untuk membuat aplikasi fungsi.

  2. Buka sumber daya dan muat dependensi dengan menggunakan langkah-langkah berikut.

    Catatan

    Anda hanya perlu memuat dependensi pada kali pertama. Jika dependensi PowerShell gagal dimuat, periksa versi Az terbaru dan Az.ResourceGraph.

    1. Untuk Aplikasi Fungsi, pilih File aplikasi.

    2. Di bawah host.json, atur ManagedDependecy ke True dan pilih requirements.psd1.

    3. Di bawah requirements.psd1, tempelkan kode berikut:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Pilih Simpan.

  3. Mulai ulang aplikasi fungsi dari tab Gambaran Umum untuk memuat dependensi yang disebutkan dalam file requirements.psd1 .

Membuat fungsi

  1. Setelah Anda membuat aplikasi fungsi, buka sumber daya, buka Gambaran Umum, lalu pilih Buat di portal Microsoft Azure.

  2. Pada panel Buat fungsi , buat pilihan berikut:

    1. Di bawah Pilih lingkungan pengembangan, untuk Lingkungan pengembangan, pilih Kembangkan di portal.

    2. Di bawah Pilih templat, pilih Event Grid.

    3. Di bawah Detail templat, untuk Fungsi Baru, pilih nama. Lalu pilih Buat.

      Cuplikan layar yang memperlihatkan pilihan untuk membuat fungsi.

  3. Pada panel Fungsi event grid , pilih Code+Test dari menu sebelah kiri. Tempelkan kode berikut, lalu pilih Simpan.

    # Make sure that you're using eventGridEvent for parameter binding in the Azure function.
    param($eventGridEvent, $TriggerMetadata)
    
    Connect-AzAccount -Identity
    
    # Install the Resource Graph module from PowerShell Gallery
    # Install-Module -Name Az.ResourceGraph
    
    $maintenanceRunId = $eventGridEvent.data.CorrelationId
    $resourceSubscriptionIds = $eventGridEvent.data.ResourceSubscriptionIds
    
    if ($resourceSubscriptionIds.Count -eq 0) {
        Write-Output "Resource subscriptions are not present."
        break
    }
    
    Write-Output "Querying ARG to get machine details [MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]"
    
    $argQuery = @"
        maintenanceresources 
        | where type =~ 'microsoft.maintenance/applyupdates'
        | where properties.correlationId =~ '$($maintenanceRunId)'
        | where id has '/providers/microsoft.compute/virtualmachines/'
        | project id, resourceId = tostring(properties.resourceId)
        | order by id asc
    "@
    
    Write-Output "Arg Query Used: $argQuery"
    
    $allMachines = [System.Collections.ArrayList]@()
    $skipToken = $null
    
    do
    {
        $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds
        $skipToken = $res.SkipToken
        $allMachines.AddRange($res.Data)
    } while ($skipToken -ne $null -and $skipToken.Length -ne 0)
    if ($allMachines.Count -eq 0) {
        Write-Output "No Machines were found."
        break
    }
    
    $jobIDs= New-Object System.Collections.Generic.List[System.Object]
    $startableStates = "stopped" , "stopping", "deallocated", "deallocating"
    
    $allMachines | ForEach-Object {
        $vmId =  $_.resourceId
    
        $split = $vmId -split "/";
        $subscriptionId = $split[2]; 
        $rg = $split[4];
        $name = $split[8];
    
        Write-Output ("Subscription Id: " + $subscriptionId)
    
        $mute = Set-AzContext -Subscription $subscriptionId
        $vm = Get-AzVM -ResourceGroupName $rg -Name $name -Status -DefaultProfile $mute
    
        $state = ($vm.Statuses[1].DisplayStatus -split " ")[1]
        if($state -in $startableStates) {
            Write-Output "Starting '$($name)' ..."
    
            $newJob = Start-ThreadJob -ScriptBlock { param($resource, $vmname, $sub) $context = Set-AzContext -Subscription $sub; Start-AzVM -ResourceGroupName $resource -Name $vmname -DefaultProfile $context} -ArgumentList $rg, $name, $subscriptionId
            $jobIDs.Add($newJob.Id)
        } else {
            Write-Output ($name + ": no action taken. State: " + $state) 
        }
    }
    
    $jobsList = $jobIDs.ToArray()
    if ($jobsList)
    {
        Write-Output "Waiting for machines to finish starting..."
        Wait-Job -Id $jobsList
    }
    
    foreach($id in $jobsList)
    {
        $job = Get-Job -Id $id
        if ($job.Error)
        {
            Write-Output $job.Error
        }
    }
    
  4. Di menu sebelah kiri, pilih Integrasi. Untuk Pemicu, masukkan nilai nama parameter Pemicu Peristiwa . Gunakan nama parameter yang sama yang diberikan di jendela Code+Test . Dalam contoh, parameternya adalah eventGridEvent.

    Cuplikan layar yang memperlihatkan entri nama parameter untuk pemicu peristiwa.

  5. Pilih Simpan.

Membuat langganan peristiwa

  1. Masuk ke portal Azure dan buka Manajer Pembaruan Azure.

  2. Di bawah Kelola, pilihKonfigurasi Pemeliharaan>.

  3. Pada panel Konfigurasi Pemeliharaan , pilih konfigurasi.

  4. Di bawah Pengaturan, pilih Peristiwa.

  5. Pilih +Langganan Acara untuk membuat acara sebelum pemeliharaan atau setelah pemeliharaan.

  6. Pada panel Buat Langganan Peristiwa , di bagian Detail Langganan Peristiwa , berikan nama yang sesuai. Pertahankan skema sebagai Skema Event Grid.

  7. Di bagian Jenis Peristiwa , untuk Filter ke Jenis Peristiwa, pilih Peristiwa Pra Pemeliharaan atau Peristiwa Pemeliharaan Pasca.

  8. Di bagian Detail Titik Akhir , pilih titik akhir Azure Function , lalu pilih Konfigurasikan titik akhir.

  9. Berikan detail yang sesuai, seperti grup sumber daya dan aplikasi fungsi untuk memicu peristiwa.

  10. Pilih Buat.

Anda juga dapat menggunakan akun Azure Storage dan pusat aktivitas untuk menyimpan, mengirim, dan menerima peristiwa. Untuk informasi selengkapnya, lihat panduan memulai cepat tentang membuat antrean di Azure Storage dan membuat Event Hub dengan menggunakan Azure portal.