Wyzwalanie elementu Runbook usługi Azure Automation przy użyciu alertu

Za pomocą usługi Azure Monitor można monitorować metryki i dzienniki na poziomie podstawowym dla większości usług na platformie Azure. Elementy Runbook usługi Azure Automation można wywoływać przy użyciu grup akcji w celu automatyzacji zadań na podstawie alertów. W tym artykule pokazano, jak skonfigurować i uruchomić element Runbook przy użyciu alertów.

Wymagania wstępne

Typy alertów

Elementy Runbook automatyzacji można używać z trzema typami alertów:

  • Typowe alerty
  • Alerty dotyczące dzienników aktywności
  • Alerty metryk niemal w czasie rzeczywistym

Uwaga

Typowy schemat alertu standandaryzuje środowisko użycia dla powiadomień o alertach na platformie Azure. W przeszłości trzy typy alertów na platformie Azure (metryka, dziennik i dziennik aktywności) miały własne szablony wiadomości e-mail, schematy elementu webhook itp. Aby dowiedzieć się więcej, zobacz Wspólny schemat alertów.

Gdy alert wywołuje element Runbook, rzeczywiste wywołanie to żądanie HTTP POST do elementu webhook. Treść żądania POST zawiera obiekt w formacie JSON, który ma przydatne właściwości powiązane z alertem. Poniższa tabela zawiera linki do schematu ładunku dla każdego typu alertu:

Alerty opis Schemat ładunku
Typowy alert Typowy schemat alertu, który standandaryzuje środowisko użycia dla powiadomień o alertach na platformie Azure już dzisiaj. Typowy schemat ładunku alertu.
Alert dziennika aktywności Wysyła powiadomienie, gdy dowolne nowe zdarzenie w dzienniku aktywności platformy Azure jest zgodne z określonymi warunkami. Na przykład w przypadku Delete VM wystąpienia operacji w grupie myProductionResourceGroup lub pojawieniu się nowego zdarzenia usługi Azure Service Health z aktywnym stanem. Schemat ładunku alertu dziennika aktywności
Alert dotyczący metryk niemal w czasie rzeczywistym Wysyła powiadomienie szybciej niż alerty metryk, gdy co najmniej jedna metryka na poziomie platformy spełnia określone warunki. Na przykład gdy wartość % procesora CPU na maszynie wirtualnej jest większa niż 90, a wartość parametru Network In jest większa niż 500 MB w ciągu ostatnich 5 minut. Schemat ładunku alertu metryki niemal w czasie rzeczywistym

Ponieważ dane udostępniane przez każdy typ alertu są różne, każdy typ alertu jest obsługiwany inaczej. W następnej sekcji dowiesz się, jak utworzyć element Runbook do obsługi różnych typów alertów.

Przypisywanie uprawnień do tożsamości zarządzanych

Przypisz uprawnienia do odpowiedniej tożsamości zarządzanej, aby umożliwić jej zatrzymanie maszyny wirtualnej. Element Runbook może używać przypisanej przez system tożsamości zarządzanej konta usługi Automation lub tożsamości zarządzanej przypisanej przez użytkownika. Podano kroki przypisywania uprawnień do każdej tożsamości. W poniższych krokach użyj programu PowerShell. Jeśli wolisz korzystać z portalu, zobacz Przypisywanie ról platformy Azure przy użyciu witryny Azure Portal.

  1. Zaloguj się interaktywnie na platformie Azure przy użyciu polecenia cmdlet Połączenie-AzAccount i postępuj zgodnie z instrukcjami.

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. Podaj odpowiednią wartość dla poniższych zmiennych, a następnie wykonaj skrypt.

    $resourceGroup = "resourceGroup"
    $automationAccount = "AutomationAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    
  3. Użyj polecenia cmdlet programu PowerShell New-AzRoleAssignment , aby przypisać rolę do przypisanej przez system tożsamości zarządzanej.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  4. Przypisz rolę do tożsamości zarządzanej przypisanej przez użytkownika.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity)
    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  5. W przypadku tożsamości zarządzanej przypisanej przez system pokaż ClientId i zapisz wartość do późniejszego użycia.

    $UAMI.ClientId
    

Tworzenie elementu Runbook do obsługi alertów

Aby używać usługi Automation z alertami, potrzebny jest element Runbook, który zarządza ładunkiem JSON alertu przekazywanym do elementu Runbook. Poniższy przykładowy element Runbook musi być wywoływany z alertu platformy Azure.

Zgodnie z opisem w poprzedniej sekcji każdy typ alertu ma inny schemat. Skrypt pobiera dane elementu webhook z alertu w parametrze wejściowym WebhookData elementu Runbook. Następnie skrypt oblicza ładunek JSON, aby określić, który typ alertu jest używany.

W tym przykładzie jest używany alert z maszyny wirtualnej platformy Azure. Pobiera dane maszyny wirtualnej z ładunku, a następnie używa tych informacji do zatrzymania maszyny wirtualnej. Połączenie należy skonfigurować na koncie usługi Automation, na którym jest uruchamiany element Runbook. W przypadku używania alertów do wyzwalania elementów Runbook ważne jest sprawdzenie stanu alertu w wyzwalanym elemecie Runbook. Element Runbook jest wyzwalany za każdym razem, gdy alert zmienia stan. Alerty mają wiele stanów, z których dwa najczęściej są aktywowane i rozwiązywane. Sprawdź stan w logice elementu Runbook, aby upewnić się, że element Runbook nie działa więcej niż raz. W przykładzie w tym artykule pokazano, jak wyszukać alerty tylko z aktywowanym stanem.

Element Runbook używa przypisanej przez system tożsamości zarządzanej konta usługi Automation do uwierzytelniania na platformie Azure w celu wykonania akcji zarządzania względem maszyny wirtualnej. Element Runbook można łatwo zmodyfikować w celu używania tożsamości zarządzanej przypisanej przez użytkownika.

Uwaga

Zalecamy używanie dostępu do sieci publicznej, ponieważ nie można użyć alertu platformy Azure (metryki, dziennika i dziennika aktywności) w celu wyzwolenia elementu webhook usługi Automation, gdy konto usługi Automation korzysta z linków prywatnych i skonfigurowano z dostępem publicznym ustawionym na wartość Wyłącz.

Użyj tego przykładu, aby utworzyć element runbook o nazwie Stop-AzureVmInResponsetoVMAlert. Możesz zmodyfikować skrypt programu PowerShell i użyć go z wieloma różnymi zasobami.

  1. Zaloguj się do witryny Azure Portal i przejdź do swojego konta usługi Automation.

  2. W obszarze Automatyzacja procesów wybierz pozycję Elementy Runbook.

  3. Wybierz pozycję + Utwórz element Runbook.

    1. Nadaj elementowi runbook Stop-AzureVmInResponsetoVMAlertnazwę .
    2. Z listy rozwijanej Typ elementu Runbook wybierz pozycję PowerShell.
    3. Wybierz pozycję Utwórz.
  4. W edytorze elementów Runbook wklej następujący kod:

    [OutputType("PSAzureOperationResponse")]
    param
    (
        [Parameter (Mandatory=$false)]
        [object] $WebhookData
    )
    $ErrorActionPreference = "stop"
    
    if ($WebhookData)
    {
        # Get the data object from WebhookData
        $WebhookBody = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
    
        # Get the info needed to identify the VM (depends on the payload schema)
        $schemaId = $WebhookBody.schemaId
        Write-Verbose "schemaId: $schemaId" -Verbose
        if ($schemaId -eq "azureMonitorCommonAlertSchema") {
            # This is the common Metric Alert schema (released March 2019)
            $Essentials = [object] ($WebhookBody.data).essentials
            # Get the first target only as this script doesn't handle multiple
            $alertTargetIdArray = (($Essentials.alertTargetIds)[0]).Split("/")
            $SubId = ($alertTargetIdArray)[2]
            $ResourceGroupName = ($alertTargetIdArray)[4]
            $ResourceType = ($alertTargetIdArray)[6] + "/" + ($alertTargetIdArray)[7]
            $ResourceName = ($alertTargetIdArray)[-1]
            $status = $Essentials.monitorCondition
        }
        elseif ($schemaId -eq "AzureMonitorMetricAlert") {
            # This is the near-real-time Metric Alert schema
            $AlertContext = [object] ($WebhookBody.data).context
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = $AlertContext.resourceName
            $status = ($WebhookBody.data).status
        }
        elseif ($schemaId -eq "Microsoft.Insights/activityLogs") {
            # This is the Activity Log Alert schema
            $AlertContext = [object] (($WebhookBody.data).context).activityLog
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = (($AlertContext.resourceId).Split("/"))[-1]
            $status = ($WebhookBody.data).status
        }
        elseif ($schemaId -eq $null) {
            # This is the original Metric Alert schema
            $AlertContext = [object] $WebhookBody.context
            $SubId = $AlertContext.subscriptionId
            $ResourceGroupName = $AlertContext.resourceGroupName
            $ResourceType = $AlertContext.resourceType
            $ResourceName = $AlertContext.resourceName
            $status = $WebhookBody.status
        }
        else {
            # Schema not supported
            Write-Error "The alert data schema - $schemaId - is not supported."
        }
    
        Write-Verbose "status: $status" -Verbose
        if (($status -eq "Activated") -or ($status -eq "Fired"))
        {
            Write-Verbose "resourceType: $ResourceType" -Verbose
            Write-Verbose "resourceName: $ResourceName" -Verbose
            Write-Verbose "resourceGroupName: $ResourceGroupName" -Verbose
            Write-Verbose "subscriptionId: $SubId" -Verbose
    
            # Determine code path depending on the resourceType
            if ($ResourceType -eq "Microsoft.Compute/virtualMachines")
            {
                # This is an Resource Manager VM
                Write-Verbose "This is an Resource Manager VM." -Verbose
    
                # Ensures you do not inherit an AzContext in your runbook
                Disable-AzContextAutosave -Scope Process
    
                # Connect to Azure with system-assigned managed identity
                $AzureContext = (Connect-AzAccount -Identity).context
    
                # set and store context
                $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
    
                # Stop the Resource Manager VM
                Write-Verbose "Stopping the VM - $ResourceName - in resource group - $ResourceGroupName -" -Verbose
                Stop-AzVM -Name $ResourceName -ResourceGroupName $ResourceGroupName -DefaultProfile $AzureContext -Force
                # [OutputType(PSAzureOperationResponse")]
            }
            else {
                # ResourceType not supported
                Write-Error "$ResourceType is not a supported resource type for this runbook."
            }
        }
        else {
            # The alert status was not 'Activated' or 'Fired' so no action taken
            Write-Verbose ("No action taken. Alert status: " + $status) -Verbose
        }
    }
    else {
        # Error
        Write-Error "This runbook is meant to be started from an Azure alert webhook only."
    }
    
  5. Jeśli chcesz, aby element Runbook był wykonywany przy użyciu tożsamości zarządzanej przypisanej przez system, pozostaw kod w stanie rzeczywistym. Jeśli wolisz użyć tożsamości zarządzanej przypisanej przez użytkownika, wykonaj:

    1. Z wiersza 78 usuń $AzureContext = (Connect-AzAccount -Identity).context,
    2. Zastąp go ciągiem $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context, i
    3. Wprowadź uzyskany wcześniej identyfikator klienta.
  6. Po wyświetleniu monitu wybierz pozycję Zapisz, Opublikuj, a następnie pozycję Tak.

  7. Zamknij stronę Runbook, aby wrócić do strony Konto usługi Automation.

Tworzenie alertu

Alerty używają grup akcji, które są kolekcjami akcji wyzwalanych przez alert. Elementy Runbook to tylko jedna z wielu akcji, których można używać z grupami akcji.

  1. Na koncie usługi Automation w obszarze Monitorowanie wybierz pozycję Alerty.

  2. Wybierz pozycję + Nowa reguła alertu, aby otworzyć stronę Tworzenie reguły alertu.

    The create alert rule page and subsections.

  3. W obszarze Zakres wybierz pozycję Edytuj zasób.

  4. Na stronie Wybieranie zasobu z listy rozwijanej Filtruj według typu zasobu wybierz pozycję Maszyny wirtualne.

  5. Zaznacz pole wyboru obok maszyn wirtualnych, które chcesz monitorować. Następnie wybierz pozycję Gotowe, aby powrócić do strony Tworzenie reguły alertu.

  6. W obszarze Warunek wybierz pozycję Dodaj warunek.

  7. Na stronie Wybieranie sygnału wprowadź Percentage CPU w polu tekstowym wyszukiwania, a następnie wybierz pozycję Procentowe użycie procesora CPU z wyników.

  8. Na stronie Konfigurowanie logiki sygnału w obszarze Wartość progu wprowadź początkową niską wartość na potrzeby testowania, taką jak 5. Możesz wrócić i zaktualizować tę wartość po potwierdzeniu, że alert działa zgodnie z oczekiwaniami. Następnie wybierz pozycję Gotowe, aby powrócić do strony Tworzenie reguły alertu.

    Entering CPU percentage threshold value.

  9. W obszarze Akcje wybierz pozycję Dodaj grupy akcji, a następnie pozycję +Utwórz grupę akcji.

    The create action group page with Basics tab open.

  10. Na stronie Tworzenie grupy akcji:

    1. Na karcie Podstawy wprowadź nazwę grupy akcji i nazwę wyświetlaną.

    2. Na karcie Akcje w polu tekstowym Nazwa wprowadź nazwę. Następnie z listy rozwijanej Typ akcji wybierz pozycję Element Runbook usługi Automation, aby otworzyć stronę Konfigurowanie elementu Runbook.

      1. Dla elementu źródłowego elementu Runbook wybierz pozycję Użytkownik.

      2. Z listy rozwijanej Subskrypcja wybierz swoją subskrypcję.

      3. Z listy rozwijanej Konto usługi Automation wybierz swoje konto usługi Automation.

      4. Z listy rozwijanej Element Runbook wybierz pozycję Stop-AzureVmInResponsetoVMAlert.

      5. W polu Włącz wspólny element schematu alertu wybierz pozycję Tak.

      6. Wybierz przycisk OK , aby powrócić do strony Tworzenie grupy akcji.

        Configure runbook page with values.

    3. Wybierz pozycję Przejrzyj i utwórz, a następnie pozycję Utwórz, aby powrócić do strony Tworzenie reguły alertu.

  11. W obszarze Szczegóły reguły alertu w polu tekstowym Nazwa reguły alertu.

  12. Wybierz pozycję Utwórz regułę alertu. Możesz użyć grupy akcji w alertach dziennika aktywności i alertach niemal w czasie rzeczywistym, które tworzysz.

Weryfikacja

Upewnij się, że maszyna wirtualna jest uruchomiona. Przejdź do elementu runbook Stop-AzureVmInResponsetoVMAlert i poszukaj na liście Ostatnie zadania , aby wypełnić. Po pojawieniu się ukończonego zadania wybierz zadanie i przejrzyj dane wyjściowe. Sprawdź również, czy maszyna wirtualna została zatrzymana.

Showing output from job.

Typowe operacje zarządzania maszynami wirtualnymi platformy Azure

Usługa Azure Automation udostępnia skrypty dla typowych operacji zarządzania maszynami wirtualnymi platformy Azure, takich jak ponowne uruchamianie maszyny wirtualnej, zatrzymywanie maszyny wirtualnej, usuwanie maszyny wirtualnej, skalowanie w górę i w dół scenariuszy w galerii elementów Runbook. Skrypty można również znaleźć w repozytorium GitHub usługi Azure Automation. Możesz również użyć tych skryptów, jak wspomniano w powyższych krokach.

Operacje zarządzania maszynami wirtualnymi platformy Azure Szczegóły
Stop-Azure-VM-On-Alert Ten element Runbook zatrzyma maszynę wirtualną usługi Azure Resource Manager w odpowiedzi na wyzwalacz alertu platformy Azure.

Dane wejściowe to dane alertu zawierające informacje potrzebne do zidentyfikowania maszyny wirtualnej do zatrzymania.

Element Runbook musi być wywoływany z alertu platformy Azure za pośrednictwem elementu webhook.

Do konta usługi Automation należy dodać najnowszą wersję modułu Az.

Tożsamość zarządzana powinna być włączona i należy podać dostęp współautora do konta usługi Automation.
Restart-Azure-VM-On-Alert Ten element Runbook zatrzyma maszynę wirtualną usługi Azure Resource Manager w odpowiedzi na wyzwalacz alertu platformy Azure.

Dane wejściowe to dane alertu zawierające informacje potrzebne do zidentyfikowania maszyny wirtualnej do zatrzymania.

Element Runbook musi być wywoływany z alertu platformy Azure za pośrednictwem elementu webhook.

Do konta usługi Automation należy dodać najnowszą wersję modułu Az.

Tożsamość zarządzana powinna być włączona i należy podać dostęp współautora do konta usługi Automation.
Delete-Azure-VM-On-Alert Ten element Runbook zatrzyma maszynę wirtualną usługi Azure Resource Manager w odpowiedzi na wyzwalacz alertu platformy Azure.

Dane wejściowe to dane alertu zawierające informacje potrzebne do zidentyfikowania maszyny wirtualnej do zatrzymania.

Element Runbook musi być wywoływany z alertu platformy Azure za pośrednictwem elementu webhook.

Do konta usługi Automation należy dodać najnowszą wersję modułu Az.

Tożsamość zarządzana powinna być włączona i należy podać dostęp współautora do konta usługi Automation.
ScaleDown-Azure-VM-On-Alert Ten element Runbook zatrzyma maszynę wirtualną usługi Azure Resource Manager w odpowiedzi na wyzwalacz alertu platformy Azure.

Dane wejściowe to dane alertu zawierające informacje potrzebne do zidentyfikowania maszyny wirtualnej do zatrzymania.

Element Runbook musi być wywoływany z alertu platformy Azure za pośrednictwem elementu webhook.

Do konta usługi Automation należy dodać najnowszą wersję modułu Az.

Tożsamość zarządzana powinna być włączona i należy podać dostęp współautora do konta usługi Automation.
ScaleUp-Azure-VM-On-Alert Ten element Runbook zatrzyma maszynę wirtualną usługi Azure Resource Manager w odpowiedzi na wyzwalacz alertu platformy Azure.

Dane wejściowe to dane alertu zawierające informacje potrzebne do zidentyfikowania maszyny wirtualnej do zatrzymania.

Element Runbook musi być wywoływany z alertu platformy Azure za pośrednictwem elementu webhook.

Do konta usługi Automation należy dodać najnowszą wersję modułu Az.

Tożsamość zarządzana powinna być włączona i należy podać dostęp współautora do konta usługi Automation.

Następne kroki