Delen via


Zelfstudie: pre- en postgebeurtenissen maken met Azure Functions

Van toepassing op: ✔️ Windows-VM's linux-VM's ✔️ ✔️ on-premises azure-VM's ✔️ ✔️ met Azure Arc-servers.

In deze zelfstudie wordt uitgelegd hoe u gebeurtenissen vooraf maakt en post om een VIRTUELE machine te starten en te stoppen in een werkstroom voor een planningspatch met behulp van Azure Functions.

In deze zelfstudie leert u het volgende:

  • Vereisten
  • Een functie-app maken
  • Een functie maken
  • Een gebeurtenisabonnement maken

Vereisten

  1. Zorg ervoor dat u powerShell 7.2-runbook gebruikt.

  2. Machtiging toewijzen aan beheerde identiteiten: u kunt machtigingen toewijzen aan de juiste beheerde identiteit. Het runbook kan de door het Automation-account toegewezen beheerde identiteit of een door de gebruiker toegewezen beheerde identiteit gebruiken.

    U kunt portal- of PowerShell-cmdlets gebruiken om machtigingen toe te wijzen aan elke identiteit:

    Volg de stappen in Azure-rollen toewijzen met behulp van Azure Portal om machtigingen toe te wijzen


  1. Importeer de Az.ResourceGraph module en zorg ervoor dat de module wordt bijgewerkt naar ThreadJob met moduleversie 2.0.3.

Een functie-app maken

  1. Volg de stappen om een functie-app te maken.

  2. Nadat u de functie-app hebt gemaakt, gaat u naar de resource en zorgt u ervoor dat u de afhankelijkheden laadt door de volgende stappen uit te voeren:

    Notitie

    U moet de afhankelijkheden alleen voor de eerste keer laden. Als de PowerShell-afhankelijkheden niet worden geladen. Controleer de nieuwste versies van AZ en AZ. ResourceGraph.

    1. Selecteer app-bestanden in de functie-app.

    2. Schakel onder de host.json ManagedDependecy in op True en selecteer requirements.psd1.

    3. Plak onder de requirements.psd1 de volgende code:

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

  3. Start de functie-app opnieuw op het tabblad Overzicht om de afhankelijkheden te laden die worden vermeld in het bestand requirements.psd1 .

Een functie maken

  1. Nadat u de functie-app hebt gemaakt, gaat u naar Resource en selecteert u Maken in Azure Portal in Overzicht.

  2. Maak in het venster Functie maken de volgende selecties:

    1. Selecteer Ontwikkelen in de portal voor de eigenschap Ontwikkelomgeving
    2. Selecteer Event Grid in Een sjabloon selecteren.
    3. Voer in Sjabloondetails de naam in nieuwe functie in en selecteer vervolgens Maken. Schermopname van de opties die u kunt selecteren tijdens het maken van een functie.
  3. Selecteer in de functie Event Grid Code+Test in het linkermenu, plak de volgende code en selecteer Opslaan.

    # 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. Selecteer Integratie in het linkermenu en bewerk de parameternaam van de gebeurtenistrigger onder Trigger. Gebruik dezelfde parameternaam in het venster Code+Test . In het voorbeeld is de parameter eventGridEvent.

    Schermopname van de parameter eventGridEvent.

  5. Selecteer Opslaan

Een gebeurtenisabonnement maken

  1. Meld u aan bij Azure Portal en ga naar Azure Update Manager.
  2. Selecteer onder Beheren de optie Machines, Onderhoudsconfiguratie.
  3. Selecteer de configuratie op de pagina Onderhoudsconfiguratie .
  4. Selecteer onder Instellingen de optie Gebeurtenissen.
  5. Selecteer +Gebeurtenisabonnement om een pre-/postonderhoudsgebeurtenis te maken.
  6. Voer op de pagina Gebeurtenisabonnement maken de volgende gegevens in:
    1. Geef in de sectie Details van gebeurtenisabonnement een geschikte naam op.
    2. Behoud het schema als Event Grid-schema.
    3. Filter op gebeurtenistypen in de sectie Gebeurtenistypen.
      1. Selecteer Pre-onderhoudsgebeurtenis voor een pregebeurtenis.
        • Selecteer in de sectie Eindpuntdetails het Azure Function-eindpunt en selecteer Configureren en Eindpunt.
        • Geef de juiste details op, zoals resourcegroepen, functie-app om de gebeurtenis te activeren.
      2. Selecteer Gebeurtenis na onderhoud voor een postgebeurtenis.
        • In de sectie Eindpuntdetails selecteert u het Eindpunt van de Azure-functie en selecteert u Configureren en Eindpunt.
        • Geef de juiste details op, zoals resourcegroep, functie-app om de gebeurtenis te activeren.
  7. Selecteer Maken.

U kunt ook Azure Storage-accounts en Event Hub gebruiken om gebeurtenissen op te slaan, te verzenden en te ontvangen. Meer informatie over het maken van Event Hub - en Storage-wachtrijen.

Volgende stappen