Självstudie: Skapa händelser före underhåll och efter underhåll 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 självstudien beskrivs hur du skapar händelser före underhåll och efter underhåll för att starta och stoppa en virtuell dator (VM) i ett schemalagt korrigeringsarbetsflöde med hjälp av Azure Functions.

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

  • Skapa en funktionsapp.
  • Skapa en funktion.
  • Skapa en händelseprenumeration.

Förutsättningar

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

  2. Tilldela behörigheter till lämplig hanterad identitet. Körboken kan använda Automation-kontots systemtilldelade hanterad identitet eller en användartilldelad hanterad identitet.

    Följande skriptexempel (starta och stoppa virtuella datorer) kräver 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 Azure-portalen eller Azure PowerShell-cmdletar för att tilldela behörigheter till varje identitet:

    Om du vill tilldela behörigheter följer du stegen i Tilldela Azure-roller med hjälp av Azure-portalen.


  1. Importera modulen Az.ResourceGraph . Kontrollera att modulen har uppdaterats till ThreadJob med modulversion 2.0.3.

Skapa en funktionsapp

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

  2. Gå till resursen och ladda beroendena med hjälp av följande steg.

    Kommentar

    Du behöver ladda in beroendena bara första gången. Om inläsningen av PowerShell-beroenden misslyckas, kontrollera de senaste versionerna av Az och Az.ResourceGraph.

    1. För Funktionsapp väljer du Appfiler.

    2. Under host.jsonanger 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 resursen, går till Översikt och väljer sedan Skapa i Azure-portalen.

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

    1. Under Välj utvecklingsmiljö för Utvecklingsmiljö väljer du Utveckla i portalen.

    2. Under Välj en mall väljer du händelserutnät.

    3. Under Mallinformation väljer du namnet för Ny funktion. Välj sedan Skapa.

      Skärmbild som visar val för att skapa en funktion.

  3. I funktionsfönstret Händelserutnät väljer du Kod+Test på den vänstra menyn. Klistra in följande kod och välj sedan Spara.

    # 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. Välj Integrering på den vänstra menyn. För Utlösare anger du parameternamnet för händelseutlösaren . Använd samma parameternamn som anges i fönstret Kod+Test . I exemplet är eventGridEventparametern .

    Skärmbild som visar inmatningen av ett parameternamn för en händelseutlösare.

  5. Välj Spara.

Skapa en händelseprenumeration

  1. Logga in på Azure-portalen och gå till Azure Uppdateringshanteraren.

  2. Under Hantera väljer du Konfiguration av datorunderhåll>.

  3. Välj konfigurationen i fönstret Underhållskonfiguration .

  4. Under Inställningar väljer du Händelser.

  5. Välj +Händelseprenumeration för att skapa en händelse före underhåll eller efter underhåll.

  6. Ange ett lämpligt namn i avsnittet Information om händelseprenumeration i fönstret Skapa händelseprenumeration. Behåll schemat som Event Grid-schema.

  7. I avsnittet Händelsetyper för Filtrera till händelsetyper väljer du Händelse före underhåll eller Händelse efter underhåll.

  8. I avsnittet Slutpunktsinformation väljer du Slutpunkten för Azure-funktionen och väljer sedan Konfigurera en slutpunkt.

  9. Ange lämplig information, till exempel resursgruppen och funktionsappen för att utlösa händelsen.

  10. Välj Skapa.

Du kan också använda Azure Storage-konton och en händelsehubb för att lagra, skicka och ta emot händelser. Mer information finns i snabbstarterna för att skapa en kö i Azure Storage och skapa en händelsehubb med hjälp av Azure-portalen.