Dela via


Självstudie: Skapa för- och efterhändelser med hjälp av Azure Functions

Gäller för: ✔️ Virtuella Windows-datorer ✔️ Virtuella Linux-datorer ✔️ Lokal miljö ✔️ Azure VMs ✔️ Arc-aktiverade servrar.

I den här guiden beskrivs hur du skapar för- och efterhändelser för att starta och stoppa en virtuell dator i ett schemalagt patch-arbetsflöde med hjälp av Azure Functions.

I den här handledningen lär du dig hur man:

  • Förutsättningar
  • Skapa en funktionsapp
  • Skapa en funktion
  • Skapa en händelseprenumeration

Förutsättningar

  1. Kontrollera att du använder PowerShell 7.4-runbook .

  2. Tilldela behörighet till hanterade identiteter. Du kan tilldela behörigheter till lämplig hanterad identitet. Runbooken kan använda antingen den systemtilldelade hanterade identiteten hos Automation-kontot eller en användartilldelad hanterad identitet.

    För skriptexemplen nedan (Starta virtuella datorer och Stoppa virtuella datorer) krävs rollen Virtuell datordeltagare eller en anpassad roll med dessa specifika behörigheter:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtuellaMaskiner/startaOm/åtgärd
    • Microsoft.Compute/virtualMachines/powerOff/action

    Du kan använda antingen portal- eller PowerShell-cmdletar för att tilldela behörigheter till varje identitet:

    Följ stegen i Tilldela Azure-roller med hjälp av Azure Portal för att tilldela behörigheter


  1. Importera modulen Az.ResourceGraph och se till att modulen uppdateras till ThreadJob med modulversion 2.0.3.

Skapa en funktionsapp

  1. Följ stegen för att skapa en funktionsapp.

  2. När du har skapat funktionsappen Går du till resursen och ser till att du läser in beroendena genom att följa dessa steg:

    Kommentar

    Du behöver bara ladda in beroendena första gången. Om PowerShell-beroendena misslyckas med att läsas in. Kontrollera de senaste versionerna av AZ och AZ. ResourceGraph.

    1. I funktionsappen väljer du Appfiler.

    2. Under host.json aktiverar du ManagedDependecy till True och väljer requirements.psd1.

    3. Under requirements.psd1 klistrar du in följande kod:

       @{
       'Az'='12.*' 
       'Az.ResourceGraph'='1.0.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. Välj Spara.

  3. Starta om funktionsappen från fliken Översikt för att läsa in de beroenden som nämns i filen requirements.psd1 .

Skapa en funktion

  1. När du har skapat funktionsappen går du till Resurs och i Översikt väljer du Skapa i Azure Portal.

  2. I fönstret Skapa funktion gör du följande val:

    1. För egenskapen Utvecklingsmiljö väljer du Utveckla i portalen
    2. I Välj en mall väljer du Event Grid.
    3. I Mallinformation anger du namnet i Ny funktion och väljer sedan Skapa. Skärmbild som visar alternativen för att välja när du skapar en funktion.
  3. I funktionen Händelserutnät väljer du Kod+Test på den vänstra menyn, klistrar in följande kod och väljer Spara.

    # 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. Välj Integrering från den vänstra menyn och redigera namnet på parametern för Händelseutlösare under Utlösare. Använd samma parameternamn som anges i fönstret Kod+Test . I exemplet är parametern eventGridEvent.

    Skärmbild som visar parametern eventGridEvent.

  5. Välj Spara

Skapa en händelseprenumeration

  1. Logga in på Azure Portal och gå till Azure Update Manager.
  2. Under Hantera väljer du Datorer, Underhållskonfiguration.
  3. På sidan Underhållskonfiguration väljer du konfigurationen.
  4. Under Inställningar väljer du Händelser.
  5. Välj +Händelseprenumeration för att skapa en händelse före/efter underhåll.
  6. På sidan Skapa händelseprenumeration anger du följande information:
    1. I avsnittet Information om händelseprenumeration anger du ett lämpligt namn.
    2. Behåll schemat som Event Grid-schema.
    3. I avsnittet Händelsetyper filtrerar du till händelsetyper.
      1. Välj Förunderhållshändelse för en förhändelse.
        • I avsnittet Slutpunktsinformation väljer du Slutpunkten för Azure-funktionen och väljer Konfigurera och Slutpunkt.
        • Ange lämplig information, till exempel Resursgrupper, funktionsapp för att utlösa händelsen.
      2. Välj Efterunderhållshändelse för en efterhändelse.
        • I avsnittet Slutpunktsinformation, välj Azure-funktionsslutpunkten och Konfigurera och slutpunkt.
        • Ange lämplig information, till exempel Resursgrupp, Funktionsapp för att utlösa händelsen.
  7. Välj Skapa.

Du kan också använda Azure Storage-konton och Händelsehubb för att lagra, skicka och ta emot händelser. Läs mer om hur du skapar händelsehubbar och lagringsköer.

Nästa steg