Freigeben über


Lernprogramm: Erstellen von Ereignissen vor und nach der Wartung mithilfe von Azure Functions

Gilt für: ✔️ Windows-VMs ✔️ Linux-VMs ✔️ Lokale Umgebung ✔️ Azure-VMs ✔️ Azure Arc-fähige Server.

In diesem Tutorial wird erläutert, wie Sie Ereignisse vor und nach der Wartung erstellen, um einen virtuellen Computer in einem geplanten Patchworkflow mithilfe von Azure Functions zu starten und zu beenden.

In diesem Tutorial lernen Sie Folgendes:

  • Erstellen einer Funktions-App.
  • Erstellen Sie eine Funktion.
  • Erstellen Sie ein Ereignisabonnement.

Voraussetzungen

  1. Stellen Sie sicher, dass Sie ein PowerShell 7.4-Runbook verwenden.

  2. Weisen Sie der entsprechenden verwalteten Identität Berechtigungen zu. Das Runbook kann die vom System zugewiesene verwaltete Identität des Automatisierungskontos oder eine vom Benutzer zugewiesene verwaltete Identität verwenden.

    Die folgenden Skriptbeispiele (Starten und Beenden von VMs) erfordern die Rolle "Mitwirkender virtueller Computer" oder eine benutzerdefinierte Rolle mit diesen spezifischen Berechtigungen:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action
    • Microsoft.Compute/virtualMachines/powerOff/action

    Sie können entweder das Azure-Portal oder Azure PowerShell-Cmdlets verwenden, um jeder Identität Berechtigungen zuzuweisen:

    Führen Sie zum Zuweisen von Berechtigungen die Schritte unter Zuweisen von Azure-Rollen mithilfe des Azure-Portals aus.


  1. Importieren Sie das Az.ResourceGraph Modul. Stellen Sie sicher, dass das Modul mit der Modulversion 2.0.3 auf ThreadJob aktualisiert wird.

Erstellen einer Funktionen-App

  1. Führen Sie die Schritte zum Erstellen einer Funktions-App aus.

  2. Wechseln Sie zu der Ressource, und laden Sie die Abhängigkeiten mithilfe der folgenden Schritte.

    Hinweis

    Sie müssen die Abhängigkeiten nur beim ersten Mal laden. Wenn die PowerShell-Abhängigkeiten nicht geladen werden, überprüfen Sie die neuesten Versionen von Az und Az.ResourceGraph.

    1. Wählen Sie für die Funktions-AppApp-Dateien aus.

    2. Legen Sie unter host.json"ManagedDependency auf „True“ fest, und wählen Sie requirements.psd1 aus.

    3. Fügen Sie unter "requirements.psd1" den folgenden Code ein:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Wählen Sie Speichern aus.

  3. Starten Sie über die Registerkarte Übersicht die Funktions-App neu, um die in der Datei requirements.psd1 aufgeführten Abhängigkeiten zu laden.

Erstellen einer Funktion

  1. Nachdem Sie die Funktions-App erstellt haben, wechseln Sie zur Ressource, wechseln Sie zu "Übersicht", und wählen Sie dann " Erstellen" im Azure-Portal aus.

  2. Wählen Sie im Bereich Funktion erstellen die folgenden Optionen aus:

    1. Unter Entwicklungsumgebung auswählen wählen Sie für Entwicklungsumgebung die Option Im Portal entwickeln aus.

    2. Wählen Sie unter "Vorlage auswählen" das Ereignisraster aus.

    3. Wählen Sie unter "Vorlagendetails" für "Neue Funktion" den Namen aus. Wählen Sie dann Erstellen aus.

      Screenshot: Auswahlmöglichkeiten zum Erstellen einer Funktion

  3. Wählen Sie im Funktionsbereich "Ereignisraster" im linken Menü Code+Test aus. Fügen Sie den folgenden Code ein, und wählen Sie dann "Speichern" aus.

    # 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. Wählen Sie im linken Menü "Integration" aus. Geben Sie für Trigger den Namenswert des Ereignistriggerparameters ein. Verwenden Sie denselben Parameternamen, der im Fenster Programmieren und testen angegeben ist. Im Beispiel lautet eventGridEventder Parameter .

    Screenshot des Eintrags eines Parameternamens für einen Ereignistrigger.

  5. Wählen Sie Speichern aus.

Erstellen eines Ereignisabonnements

  1. Melden Sie sich beim Azure-Portal an, und navigieren Sie zu Azure Update Manager.

  2. Wählen Sie unter "Verwalten" die Option "Maschinen>Wartungskonfiguration" aus.

  3. Wählen Sie im Bereich "Wartungskonfiguration " die Konfiguration aus.

  4. Wählen Sie unter Einstellungen die Option Ereignisse aus.

  5. Wählen Sie +Ereignisabonnement aus, um ein Ereignis vor der Wartung oder nach der Wartung zu erstellen.

  6. Geben Sie im Bereich " Ereignisabonnement erstellen" im Abschnitt " Ereignisabonnementdetails " einen geeigneten Namen an. Behalten Sie für das Schema die Option Event Grid-Schema bei.

  7. Wählen Sie im Abschnitt Ereignistypen für Nach Ereignistypen filtern die Option Ereignis vor der Wartung oder Ereignis nach der Wartung aus.

  8. Wählen Sie im Abschnitt "Endpunktdetails " den Azure-Funktionsendpunkt und dann " Endpunkt konfigurieren" aus.

  9. Geben Sie die entsprechenden Details an, z. B. die Ressourcengruppe und die Funktions-App, um das Ereignis auszulösen.

  10. Klicken Sie auf Erstellen.

Sie können auch Azure Storage-Konten und einen Event Hub verwenden, um Ereignisse zu speichern, zu senden und zu empfangen. Weitere Informationen finden Sie in den Schnellstarts zum Erstellen einer Warteschlange in Azure Storage und zum Erstellen eines Event Hubs mithilfe des Azure-Portals.