Udostępnij za pomocą


Samouczek: tworzenie zdarzeń przed konserwacją i po konserwacji przy użyciu usługi Azure Functions

Dotyczy: ✔️ Maszyny wirtualne z systemem Windows Maszyny ✔️ wirtualne z systemem Linux ✔️ w środowisku ✔️ lokalnym maszyn wirtualnych platformy Azure maszyn wirtualnych platformy ✔️ Azure z obsługą usługi Azure Arc.

W tym samouczku wyjaśniono, jak utworzyć zdarzenia przed konserwacją i po konserwacji, aby uruchomić i zatrzymać maszynę wirtualną (VM) w zaplanowanym procesie aktualizacji przy użyciu Azure Functions.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Tworzenie aplikacji funkcji.
  • Utwórz funkcję.
  • Utwórz subskrypcję zdarzeń.

Wymagania wstępne

  1. Upewnij się, że używasz runbooka PowerShell 7.4.

  2. Przypisz uprawnienia do odpowiedniej tożsamości zarządzanej. Runbook może używać przypisanej przez system tożsamości zarządzanej konta Automation lub tożsamości zarządzanej przypisanej przez użytkownika.

    Następujące przykłady skryptów (uruchamianie i zatrzymywanie maszyn wirtualnych) wymagają roli Współautor maszyny wirtualnej lub roli niestandardowej z następującymi określonymi uprawnieniami:

    • Microsoft.Compute/maszynyWirtualne/start/akcja
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action (akcja)
    • Microsoft.Compute/virtualMachines/powerOff/action

    Aby przypisać uprawnienia do każdej tożsamości, możesz użyć witryny Azure Portal lub poleceń cmdlet programu Azure PowerShell:

    Aby przypisać uprawnienia, wykonaj kroki opisane w temacie Przypisywanie ról platformy Azure przy użyciu witryny Azure Portal.


  1. Zaimportuj Az.ResourceGraph moduł. Upewnij się, że moduł został zaktualizowany do wersji 2.0.3 modułu ThreadJob.

Tworzenie aplikacji funkcji

  1. Wykonaj kroki tworzenia aplikacji funkcji.

  2. Przejdź do zasobu i załaduj zależności, wykonując następujące kroki.

    Uwaga

    Musisz tylko załadować zależności po raz pierwszy. Jeśli nie można załadować zależności programu PowerShell, sprawdź najnowsze wersje programu Az i Az.ResourceGraph.

    1. W obszarze Aplikacja funkcji wybierz pozycję Pliki aplikacji.

    2. W host.json ustaw wartość ManagedDependency na True i wybierz pozycję requirements.psd1.

    3. W obszarze requirements.psd1 wklej następujący kod:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Wybierz pozycję Zapisz.

  3. Uruchom ponownie aplikację funkcji z karty Przegląd , aby załadować zależności wymienione w pliku requirements.psd1 .

Tworzenie funkcji

  1. Po utworzeniu aplikacji funkcji przejdź do zasobu, przejdź do Przegląd, a następnie wybierz Utwórz w portalu Azure.

  2. W okienku Tworzenie funkcji wybierz następujące opcje:

    1. W obszarze Wybierz środowisko projektowe w obszarze Środowisko programistyczne wybierz pozycję Develop in portal (Programowanie w portalu).

    2. W obszarze Wybierz szablon wybierz pozycję Event Grid.

    3. W obszarze Szczegóły szablonu w obszarze Nowa funkcja wybierz nazwę. Następnie wybierz Utwórz.

      Zrzut ekranu przedstawiający opcje tworzenia funkcji.

  3. W okienku Funkcji usługi Event Grid wybierz pozycję Kod+Test z menu po lewej stronie. Wklej następujący kod, a następnie wybierz pozycję Zapisz.

    # 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 menu po lewej stronie wybierz pozycję Integracja. W polu Wyzwalacz wprowadź wartość nazwy parametru wyzwalacza zdarzeń . Użyj tej samej nazwy parametru podanej w oknie Kod+test . W tym przykładzie parametr ma wartość eventGridEvent.

    Zrzut ekranu przedstawiający wpis nazwy parametru wyzwalacza zdarzenia.

  5. Wybierz pozycję Zapisz.

Tworzenie subskrypcji zdarzeń

  1. Zaloguj się do witryny Azure Portal i przejdź do usługi Menedżer aktualizacji platformy Azure.

  2. W obszarze Zarządzanie wybierz pozycjęKonfiguracja konserwacji>.

  3. W okienku Konfiguracja konserwacji wybierz konfigurację.

  4. W obszarze Ustawienia wybierz pozycję Zdarzenia.

  5. Wybierz +Subskrypcję zdarzeń, aby utworzyć zdarzenie przed lub po konserwacji.

  6. W okienku Tworzenie subskrypcji zdarzeń w sekcji Szczegóły subskrypcji zdarzeń podaj odpowiednią nazwę. Zachowaj schemat jako schemat usługi Event Grid.

  7. W sekcji Typy zdarzeń w polu Filtruj do typów zdarzeń wybierz pozycję Zdarzenie przed konserwacją lub Zdarzenie po konserwacji.

  8. W sekcji Szczegóły punktu końcowego wybierz punkt końcowy funkcji platformy Azure , a następnie wybierz pozycję Konfiguruj punkt końcowy.

  9. Podaj odpowiednie szczegóły, takie jak grupa zasobów i aplikacja funkcyjna, aby wyzwolić zdarzenie.

  10. Wybierz pozycję Utwórz.

Możesz również używać kont usługi Azure Storage i centrum zdarzeń do przechowywania, wysyłania i odbierania zdarzeń. Aby uzyskać więcej informacji, zobacz przewodniki Szybki start dotyczące tworzenia kolejki w usłudze Azure Storage i tworzenia centrum zdarzeń przy użyciu witryny Azure Portal.