Usare un avviso per attivare un runbook di Automazione di Azure

È possibile usare Monitoraggio di Azure per monitorare metriche e log di livello base per la maggior parte dei servizi in Azure. È possibile chiamare Automazione di Azure runbook usando i gruppi di azioni per automatizzare le attività in base agli avvisi. Questo articolo illustra come configurare ed eseguire un runbook usando gli avvisi.

Prerequisiti

Tipi di avviso

È possibile usare i runbook di automazione con tre tipi di avviso:

  • Avvisi comuni
  • Avvisi dei log attività
  • Avvisi di metriche quasi in tempo reale

Nota

Lo schema di avviso comune standardizza l'esperienza di utilizzo per le notifiche di avviso in Azure. Storicamente, i tre tipi di avviso in Azure (metrica, log e log attività) hanno avuto modelli di posta elettronica, schemi webhook e così via. Per altre informazioni, vedere Schema di avviso comune.

Quando un avviso chiama un runbook, la chiamata effettiva è una richiesta HTTP POST al webhook. Il corpo della richiesta POST contiene un oggetto in formato JSON con proprietà utili relative all'avviso. La tabella seguente elenca i collegamenti allo schema del payload per ogni tipo di avviso:

Avviso Descrizione Schema del payload
Avviso comune Lo schema di avviso comune che standardizza attualmente l'esperienza di utilizzo per le notifiche di avviso in Azure. Schema del payload di avviso comune.
Avviso del log attività Invia una notifica quando qualsiasi nuovo evento nel log attività di Azure soddisfa condizioni specifiche. Ad esempio, quando si verifica un'operazione Delete VM in myProductionResourceGroup o quando viene visualizzato un nuovo evento di integrità dei servizi di Azure con uno stato Attivo. Schema payload avviso log attività
Avvisi delle metriche quasi in tempo reale Invia una notifica più velocemente rispetto agli avvisi delle metriche quando una o più metriche a livello di piattaforma soddisfano le condizioni specificate. Ad esempio, quando il valore per % CPU in una macchina virtuale è maggiore di 90 e il valore per Rete in ingresso è maggiore di 500 MB per gli ultimi 5 minuti. Schema payload avvisi metriche quasi in tempo reale

Poiché i dati forniti da ogni tipo di avviso sono diversi, ogni tipo di avviso deve essere gestito in modo diverso. Nella sezione seguente viene illustrato come creare un runbook per gestire i diversi tipi di avvisi.

Assegnare le autorizzazioni alle identità gestite

Assegnare le autorizzazioni all'identità gestita appropriata per consentire l'arresto di una macchina virtuale. Il runbook può usare l'identità gestita assegnata dal sistema dell'account di Automazione o un'identità gestita assegnata dall'utente. Vengono forniti passaggi per assegnare le autorizzazioni a ogni identità. La procedura seguente usa PowerShell. Se si preferisce usare il portale, vedere Assegnare ruoli di Azure usando il portale di Azure.

  1. Accedere ad Azure in modo interattivo usando il cmdlet Connessione-AzAccount e seguire le istruzioni.

    # 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. Specificare un valore appropriato per le variabili seguenti e quindi eseguire lo script.

    $resourceGroup = "resourceGroup"
    $automationAccount = "AutomationAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    
  3. Usare il cmdlet di PowerShell New-AzRoleAssignment per assegnare un ruolo all'identità gestita assegnata dal sistema.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  4. Assegnare un ruolo a un'identità gestita assegnata dall'utente.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity)
    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  5. Per l'identità gestita assegnata dal sistema, visualizzare ClientId e registrare il valore per un uso successivo.

    $UAMI.ClientId
    

Creare un runbook per gestire gli avvisi

Per usare Automazione con gli avvisi, è necessario un runbook che gestisce il payload JSON di avviso passato al runbook. Il seguente runbook di esempio deve essere chiamato da un avviso di Azure.

Come descritto nella sezione precedente, ogni tipo di avviso ha uno schema diverso. Lo script accetta i dati del webhook da un avviso nel parametro di input runbook WebhookData. Lo script valuta quindi il payload JSON per determinare il tipo di avviso usato.

Questo esempio usa un avviso da una macchina virtuale (VM) di Azure. Recupera i dati della macchina virtuale dal payload e usa le informazioni per arrestare la macchina virtuale. La connessione deve essere configurata nell'account di Automazione in cui è eseguito il runbook. Quando si usano avvisi per attivare i runbook, è importante controllare lo stato dell'avviso nel runbook attivato. Il runbook viene attivato ogni volta che lo stato dell'avviso cambia. Gli avvisi hanno più stati; i due più comuni sono Attivato e Risolto. Verificare lo stato nella logica del runbook per assicurarsi che il runbook non venga eseguito più di una volta. L'esempio in questo articolo illustra come cercare solo gli avvisi con stato Attivato.

Il runbook usa l'identità gestita assegnata dal sistema dell'account di Automazione per eseguire l'autenticazione con Azure per eseguire l'azione di gestione sulla macchina virtuale. Il runbook può essere facilmente modificato per usare un'identità gestita assegnata dall'utente.

Nota

È consigliabile usare l'accesso alla rete pubblica perché non è possibile usare un avviso di Azure (metrica, log e log attività) per attivare un webhook di Automazione quando l'account di Automazione usa collegamenti privati e configurato con l'accesso pubblico impostato su Disabilita.

Usare questo esempio per creare un runbook denominato Stop AzureVmInResponsetoVMAlert. È possibile modificare lo script di PowerShell e usarlo con molte risorse diverse.

  1. Accedere al portale di Azure e passare all'account di Automazione.

  2. In Automazione processi selezionare Runbook.

  3. Selezionare + Crea un runbook.

    1. Assegnare al runbook Stop-AzureVmInResponsetoVMAlertil nome .
    2. Nell'elenco a discesa Tipo di runbook selezionare PowerShell.
    3. Seleziona Crea.
  4. Nell'editor dei runbook incollare il codice seguente:

    [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. Se si vuole che il runbook venga eseguito con l'identità gestita assegnata dal sistema, lasciare invariato il codice. Se si preferisce usare un'identità gestita assegnata dall'utente, procedere come illustrato di seguito:

    1. Dalla riga 78 rimuovere $AzureContext = (Connect-AzAccount -Identity).context,
    2. Sostituirlo con $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).contexte
    3. Immettere l'ID client ottenuto in precedenza.
  6. Selezionare Salva, Pubblica e quindi quando richiesto.

  7. Chiudere la pagina Runbook per tornare alla pagina Account di Automazione.

Creare l'avviso

Gli avvisi usano i gruppi di azioni, ovvero raccolte di azioni attivate dall'avviso. I runbook sono solo una delle molte azioni disponibili con i gruppi di azioni.

  1. Nell'account di Automazione, in Monitoraggio selezionare Avvisi.

  2. Selezionare + Nuova regola di avviso per aprire la pagina Crea regola di avviso.

    The create alert rule page and subsections.

  3. In Ambito selezionare Modifica risorsa.

  4. Nell'elenco a discesa Filtra per tipo di risorsa della pagina Selezionare una risorsa selezionare Macchine virtuali.

  5. Selezionare la casella accanto alle macchine virtuali da monitorare. Selezionare quindi Fine per tornare alla pagina Crea regola di avviso.

  6. In Condizione selezionare Aggiungi condizione.

  7. Nella pagina Seleziona un segnale immettere Percentage CPU nella casella di testo di ricerca e quindi selezionare Percentuale CPU nei risultati.

  8. Nella pagina Configura logica del segnale, in Valore soglia immettere un valore minimo iniziale a scopo di test, ad esempio 5. È possibile tornare indietro e aggiornare questo valore dopo aver confermato che l'avviso funziona come previsto. Selezionare quindi Fine per tornare alla pagina Crea regola di avviso.

    Entering CPU percentage threshold value.

  9. In Azioni selezionare Aggiungi gruppi di azioni e quindi +Crea gruppo di azioni.

    The create action group page with Basics tab open.

  10. Nella pagina Crea gruppo di azioni:

    1. Nella scheda Informazioni di base immettere il nome di un gruppo di azioni e il nome visualizzato.

    2. Nella scheda Azioni immettere un nome nella casella di testo Nome . Nell'elenco a discesa Tipo di azione selezionare Runbook di Automazione per aprire la pagina Configura runbook .

      1. Per l'elemento di origine runbook selezionare Utente.

      2. Nell'elenco a discesa Sottoscrizione selezionare la sottoscrizione.

      3. Nell'elenco a discesa Account di Automazione selezionare l'account di Automazione.

      4. Nell'elenco a discesa Runbook selezionare Stop-AzureVmInResponsetoVMAlert.

      5. Per l'elemento Abilita lo schema di avviso comune selezionare .

      6. Selezionare OK per tornare alla pagina Crea gruppo di azioni.

        Configure runbook page with values.

    3. Selezionare Rivedi e crea e quindi Crea per tornare alla pagina Crea regola di avviso.

  11. In Dettagli regola di avviso per la casella di testo Nome regola di avviso.

  12. Selezionare Crea regola di avviso. È possibile usare il gruppo di azioni negli avvisi del log attività e avvisi quasi in tempo reale creati.

Verifica

Verificare che la macchina virtuale sia in esecuzione. Passare al runbook Stop-AzureVmInResponsetoVMAlert e controllare l'elenco Processi recenti da popolare. Una volta visualizzato un processo completato, selezionare il processo ed esaminare l'output. Controllare anche se la macchina virtuale è stata arrestata.

Showing output from job.

Operazioni comuni di gestione delle macchine virtuali di Azure

Automazione di Azure fornisce script per operazioni comuni di gestione delle macchine virtuali di Azure, ad esempio il riavvio della macchina virtuale, l'arresto della macchina virtuale, l'eliminazione di macchine virtuali, l'aumento e la riduzione degli scenari nella raccolta di runbook. Gli script sono disponibili anche nel repository GitHub Automazione di Azure. È anche possibile usare questi script come indicato nei passaggi precedenti.

Operazioni di gestione delle macchine virtuali di Azure Dettagli
Stop-Azure-VM-On-Alert Questo runbook arresterà una macchina virtuale di Azure Resource Manager in risposta a un trigger di avviso di Azure.

L'input è costituito da dati di avviso con informazioni necessarie per identificare la macchina virtuale da arrestare.

Il runbook deve essere chiamato da un avviso di Azure tramite un webhook.

L'ultima versione del modulo Az deve essere aggiunta all'account di automazione.

È necessario abilitare l'identità gestita e fornire l'accesso collaboratore all'account di automazione.
Restart-Azure-VM-On-Alert Questo runbook arresterà una macchina virtuale di Azure Resource Manager in risposta a un trigger di avviso di Azure.

L'input è costituito da dati di avviso con informazioni necessarie per identificare la macchina virtuale da arrestare.

Il runbook deve essere chiamato da un avviso di Azure tramite un webhook.

L'ultima versione del modulo Az deve essere aggiunta all'account di automazione.

È necessario abilitare l'identità gestita e fornire l'accesso collaboratore all'account di automazione.
Delete-Azure-VM-On-Alert Questo runbook arresterà una macchina virtuale di Azure Resource Manager in risposta a un trigger di avviso di Azure.

L'input è costituito da dati di avviso con informazioni necessarie per identificare la macchina virtuale da arrestare.

Il runbook deve essere chiamato da un avviso di Azure tramite un webhook.

L'ultima versione del modulo Az deve essere aggiunta all'account di automazione.

È necessario abilitare l'identità gestita e fornire l'accesso collaboratore all'account di automazione.
ScaleDown-Azure-VM-On-Alert Questo runbook arresterà una macchina virtuale di Azure Resource Manager in risposta a un trigger di avviso di Azure.

L'input è costituito da dati di avviso con informazioni necessarie per identificare la macchina virtuale da arrestare.

Il runbook deve essere chiamato da un avviso di Azure tramite un webhook.

L'ultima versione del modulo Az deve essere aggiunta all'account di automazione.

È necessario abilitare l'identità gestita e fornire l'accesso collaboratore all'account di automazione.
ScaleUp-Azure-VM-On-Alert Questo runbook arresterà una macchina virtuale di Azure Resource Manager in risposta a un trigger di avviso di Azure.

L'input è costituito da dati di avviso con informazioni necessarie per identificare la macchina virtuale da arrestare.

Il runbook deve essere chiamato da un avviso di Azure tramite un webhook.

L'ultima versione del modulo Az deve essere aggiunta all'account di automazione.

È necessario abilitare l'identità gestita e fornire l'accesso collaboratore all'account di automazione.

Passaggi successivi