Tutorial: Erstellen von Prä- und Postereignissen mit 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 Vor- und Nachbereitungsereignisse erstellen, um mithilfe von Azure Functions eine VM in einem Patchworkflow für einen Zeitplan zu starten und zu beenden.

In diesem Tutorial lernen Sie Folgendes:

  • Voraussetzungen
  • Erstellen einer Funktionen-App
  • Erstellen einer Funktion
  • Erstellen eines Ereignisabonnements

Voraussetzungen

  1. Stellen Sie sicher, dass Sie das PowerShell 7.2-Runbook verwenden.

  2. Zuweisen von Berechtigungen zu verwalteten Identitäten – Sie können Berechtigungen für die entsprechende verwaltete Identität zuweisen. Das Runbook kann die systemseitig zugewiesene verwaltete Identität des Automation-Kontos oder eine benutzerseitig zugewiesene verwaltete Identität verwenden.

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

    Führen Sie die Schritte unter Zuweisen von Azure-Rollen mithilfe des Azure-Portals aus, um Berechtigungen zuzuweisen


  1. Importieren Sie das Az.ResourceGraph-Modul, und 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. Nachdem Sie die Funktions-App erstellt haben, wechseln Sie zu „Ressource“, und stellen Sie sicher, dass Sie die Abhängigkeiten mithilfe der folgenden Schritte laden:

    Hinweis

    Sie müssen die Abhängigkeiten lediglich beim ersten Mal laden. Wenn die PowerShell-Abhängigkeiten nicht geladen werden können. Überprüfen Sie die neuesten Versionen von AZ und AZ.ResourceGraph.

    1. Wählen Sie in der Funktions-App App-Dateien aus.

    2. Legen Sie in der Datei host.json ManagedDependecy auf True fest, und wählen Sie die Datei requirements.psd1 aus.

    3. Fügen Sie in der Datei requirements.psd1 den folgenden Code ein:

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

  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. Wechseln Sie nach dem Erstellen der Funktions-App zu Resource, und wählen Sie in der Übersicht Im Azure-Portal erstellen aus.

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

    1. Wählen Sie für die Eigenschaft Entwicklungsumgebung Im Portal entwickeln aus.
    2. Wählen Sie in Eine Vorlage auswählen Event Grid aus.
    3. Geben Sie in Vorlagendetails den Namen in Neue Funktion ein, und wählen Sie anschließend Erstellen aus. Screenshot der Optionen, die beim Erstellen einer Funktion ausgewählt werden sollen
  3. Wählen Sie in der Event Grid-Funktion im linken Menü Programmieren und testen aus, fügen Sie den folgenden Code ein, und wählen Sie Speichern aus.

    # Make sure that we are using eventGridEvent for parameter binding in 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, und bearbeiten Sie unter Trigger Parametername für Ereignistrigger. Verwenden Sie denselben Parameternamen, der im Fenster Programmieren und testen angegeben ist. Im Beispiel lautet der Parameter eventGridEvent.

    Screenshot des Parameters eventGridEvent

  5. Wählen Sie Speichern aus.

Erstellen eines Ereignisabonnements

  1. Melden Sie sich beim Azure-Portal an, und navigieren Sie zu Ihrem Azure Update Manager.
  2. Wählen Sie unter Verwalten erst Computer und dann Wartungskonfiguration aus.
  3. Wählen Sie auf der Seite Wartungskonfiguration die Konfiguration aus.
  4. Wählen Sie unter Einstellungen die Option Ereignisse aus.
  5. Wählen Sie + Ereignisabonnement aus, um ein Ereignis vor oder nach der Wartung zu erstellen.
  6. Geben Sie auf der Seite Ereignisabonnement erstellen die folgenden Details ein:
    1. Geben Sie im Abschnitt Details zum Ereignisabonnement einen geeigneten Namen an.
    2. Behalten Sie für das Schema die Option Event Grid-Schema bei.
    3. Wählen Sie im Abschnitt Ereignistypen Nach Ereignistypen filtern.
      1. Wählen Sie Vorwartungsereigniss für ein Preereignis aus.
        • Wählen Sie im Abschnitt Details zum Endpunkt den Endpunkt Azure Functions aus, und wählen Sie Konfigurieren und Endpunkt aus.
        • Geben Sie die entsprechenden Details wie Ressourcengruppen und Funktions-App an, um das Ereignis auszulösen.
      2. Wählen Sie Nachwartungsereigniss für ein Postereignis aus.
        • Wählen Sie im Abschnitt Details zum Endpunkt den Endpunkt Azure Functions aus, und wählen Sie Konfigurieren und Endpunkt aus.
        • Geben Sie die entsprechenden Details wie Ressourcengruppen und Funktions-App an, um das Ereignis auszulösen.
  7. Klicken Sie auf Erstellen.

Sie können außerdem Azure Storage-Konten und einen Event Hub zum Speichern, Senden und Empfangen von Ereignissen verwenden. Weitere Informationen finden Sie unter Erstellen eines Event Hubs und Storage-Warteschlangen.

Nächste Schritte