Usar um alerta para disparar um runbook de Automação do Azure

Você pode usar o Azure Monitor para monitorar métricas e logs de nível básico para a maioria dos serviços no Azure. Você pode chamar runbooks de Automação do Azure usando grupos de ação para automatizar tarefas com base em alertas. Este artigo mostra como configurar e executar um runbook usando alertas.

Pré-requisitos

Tipos de alerta

Você pode usar runbooks de automação com três tipos de alerta:

  • Alertas comuns
  • Alertas do registo de atividades
  • Alertas métricos quase em tempo real

Nota

O esquema de alerta comum padroniza a experiência de consumo para notificações de alerta no Azure. Historicamente, os três tipos de alerta no Azure (métrica, log e log de atividades) tinham seus próprios modelos de email, esquemas de webhook, etc. Para saber mais, consulte Esquema de alerta comum.

Quando um alerta chama um runbook, a chamada real é uma solicitação HTTP POST para o webhook. O corpo da solicitação POST contém um objeto formatado em JSON que tem propriedades úteis relacionadas ao alerta. A tabela a seguir lista links para o esquema de carga útil para cada tipo de alerta:

Alerta Descrição Esquema de carga útil
Alerta comum O esquema de alerta comum que padroniza a experiência de consumo para notificações de alerta no Azure hoje. Esquema de carga útil de alerta comum.
Alerta de registo de atividades Envia uma notificação quando qualquer novo evento no log de atividades do Azure corresponde a condições específicas. Por exemplo, quando uma Delete VM operação ocorre em myProductionResourceGroup ou quando um novo evento de Integridade do Serviço do Azure com um status Ativo aparece. Esquema de carga útil de alerta do registro de atividades
Alerta métrico quase em tempo real Envia uma notificação mais rapidamente do que os alertas de métrica quando uma ou mais métricas no nível da plataforma atendem às condições especificadas. Por exemplo, quando o valor de % de CPU em uma VM é maior que 90 e o valor de Network In é maior que 500 MB nos últimos 5 minutos. Esquema de carga útil de alerta métrico quase em tempo real

Como os dados fornecidos por cada tipo de alerta são diferentes, cada tipo de alerta é tratado de forma diferente. Na próxima seção, você aprenderá a criar um runbook para lidar com diferentes tipos de alertas.

Atribuir permissões a identidades gerenciadas

Atribua permissões à identidade gerenciada apropriada para permitir que ela pare uma máquina virtual. O runbook pode usar a identidade gerenciada atribuída pelo sistema da conta de automação ou uma identidade gerenciada atribuída pelo usuário. São fornecidas etapas para atribuir permissões a cada identidade. As etapas abaixo usam o PowerShell. Se preferir usar o Portal, consulte Atribuir funções do Azure usando o portal do Azure.

  1. Entre no Azure interativamente usando o cmdlet Connect-AzAccount e siga as instruções.

    # 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. Forneça um valor apropriado para as variáveis abaixo e, em seguida, execute o script.

    $resourceGroup = "resourceGroup"
    $automationAccount = "AutomationAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    
  3. Use o cmdlet do PowerShell New-AzRoleAssignment para atribuir uma função à identidade gerenciada atribuída ao sistema.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  4. Atribua uma função a uma identidade gerenciada atribuída pelo usuário.

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity)
    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  5. Para a identidade gerenciada atribuída ao sistema, mostre ClientId e registre o valor para uso posterior.

    $UAMI.ClientId
    

Criar um runbook para lidar com alertas

Para usar a automação com alertas, você precisa de um runbook que gerencie a carga JSON de alerta que é passada para o runbook. O runbook de exemplo a seguir deve ser chamado a partir de um alerta do Azure.

Conforme descrito na seção anterior, cada tipo de alerta tem um esquema diferente. O script obtém os dados do webhook de um alerta no WebhookData parâmetro de entrada runbook. Em seguida, o script avalia a carga JSON para determinar qual tipo de alerta está sendo usado.

Este exemplo usa um alerta de uma máquina virtual (VM) do Azure. Ele recupera os dados da VM da carga útil e, em seguida, usa essas informações para parar a VM. A conexão deve ser configurada na conta de automação onde o runbook é executado. Ao usar alertas para disparar runbooks, é importante verificar o status do alerta no runbook que é acionado. O runbook é acionado sempre que o alerta muda de estado. Os alertas têm vários estados, sendo os dois mais comuns Ativado e Resolvido. Verifique o estado na lógica do runbook para garantir que o runbook não seja executado mais de uma vez. O exemplo neste artigo mostra como procurar alertas apenas com o estado Ativado.

O runbook usa a identidade gerenciada atribuída ao sistema da conta de automação para autenticar com o Azure para executar a ação de gerenciamento na VM. O runbook pode ser facilmente modificado para usar uma identidade gerenciada atribuída pelo usuário.

Nota

Recomendamos que você use o acesso à rede pública, pois não é possível usar um alerta do Azure (métrica, log e log de atividades) para acionar um webhook de Automação quando a conta de Automação estiver usando links privados e configurada com Acesso público definido como Desabilitar.

Use este exemplo para criar um runbook chamado Stop-AzureVmInResponsetoVMAlert. Você pode modificar o script do PowerShell e usá-lo com muitos recursos diferentes.

  1. Entre no portal do Azure e navegue até sua conta de automação.

  2. Em Automação de processos, selecione Runbooks.

  3. Selecione + Criar um runbook.

    1. Nomeie o runbook Stop-AzureVmInResponsetoVMAlert.
    2. Na lista suspensa Tipo de runbook, selecione PowerShell.
    3. Selecione Criar.
  4. No editor de runbook, cole o seguinte código:

    [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 você quiser que o runbook seja executado com a identidade gerenciada atribuída ao sistema, deixe o código como está. Se preferir usar uma identidade gerenciada atribuída pelo usuário, então:

    1. Da linha 78, remover $AzureContext = (Connect-AzAccount -Identity).context,
    2. Substitua-o por $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context, e
    3. Introduza o ID de Cliente obtido anteriormente.
  6. Selecione Salvar, Publicar e, em seguida, Sim quando solicitado.

  7. Feche a página Runbook para retornar à página Conta de automação.

Criar o alerta

Os alertas usam grupos de ações, que são conjuntos de ações que são acionadas pelo alerta. Os runbooks são apenas uma das muitas ações que você pode usar com grupos de ação.

  1. Na sua conta de Automação, em Monitorização, selecione Alertas.

  2. Selecione + Nova Regra de Alerta para abrir a página Criar regra de alerta.

    The create alert rule page and subsections.

  3. Em Escopo, selecione Editar recurso.

  4. Na página Selecionar um recurso, na lista suspensa Filtrar por tipo de recurso, selecione Máquinas virtuais.

  5. Marque a caixa ao lado da(s) máquina(s) virtual(is) que você deseja monitorar. Em seguida, selecione Concluído para retornar à página Criar regra de alerta.

  6. Em Condição, selecione Adicionar condição.

  7. Na página Selecione um sinal, digite Percentage CPU na caixa de texto de pesquisa e selecione Porcentagem de CPU nos resultados.

  8. Na página Configurar lógica de sinal, em Valor de limite, insira um valor baixo inicial para fins de teste, como 5. Você pode voltar e atualizar esse valor depois de confirmar que o alerta funciona conforme o esperado. Em seguida, selecione Concluído para retornar à página Criar regra de alerta.

    Entering CPU percentage threshold value.

  9. Em Ações, selecione Adicionar grupos de ações e, em seguida, +Criar grupo de ações.

    The create action group page with Basics tab open.

  10. Na página Criar grupo de ações :

    1. Na guia Noções básicas, insira um Nome do grupo de ações e Nome para exibição.

    2. Na guia Ações, na caixa de texto Nome, digite um nome. Em seguida, na lista suspensa Tipo de ação, selecione Runbook de automação para abrir a página Configurar runbook.

      1. Para o item de origem Runbook, selecione Usuário.

      2. Na lista suspensa Assinatura, selecione sua assinatura.

      3. Na lista suspensa Conta de automação, selecione sua conta de automação.

      4. Na lista suspensa Runbook, selecione Stop-AzureVmInResponsetoVMAlert.

      5. Para o item Habilitar o esquema de alerta comum, selecione Sim.

      6. Selecione OK para retornar à página Criar grupo de ações .

        Configure runbook page with values.

    3. Selecione Rever + criar e, em seguida, Criar para regressar à página Criar regra de alerta.

  11. Em Detalhes da regra de alerta, para a caixa de texto Nome da regra de alerta.

  12. Selecione Criar regra de alerta. Você pode usar o grupo de ações nos alertas de registro de atividades e alertas quase em tempo real que você criar.

Verificação

Verifique se sua VM está em execução. Navegue até o runbook Stop-AzureVmInResponsetoVMAlert e observe a lista de Trabalhos Recentes para preencher. Quando um trabalho concluído aparecer, selecione-o e revise a saída. Verifique também se a sua VM parou.

Showing output from job.

Operações comuns de gerenciamento de VM do Azure

A Automação do Azure fornece scripts para operações comuns de gerenciamento de VM do Azure, como reiniciar VM, parar VM, excluir VM, escalar cenários para cima e para baixo na galeria Runbook. Os scripts também podem ser encontrados no repositório GitHub de Automação do Azure Você também pode usar esses scripts conforme mencionado nas etapas acima.

Operações de gerenciamento de VM do Azure Detalhes
Stop-Azure-VM-On-Alert Este runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada são dados de alerta com informações necessárias para identificar qual VM deve parar.

O runbook deve ser chamado a partir de um alerta do Azure por meio de um webhook.

A versão mais recente do módulo Az deve ser adicionada à conta de automação.

A Identidade Gerenciada deve ser habilitada e o acesso do colaborador à conta de automação deve ser dado.
Restart-Azure-VM-On-Alert Este runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada são dados de alerta com informações necessárias para identificar qual VM deve parar.

O runbook deve ser chamado a partir de um alerta do Azure por meio de um webhook.

A versão mais recente do módulo Az deve ser adicionada à conta de automação.

A Identidade Gerenciada deve ser habilitada e o acesso do colaborador à conta de automação deve ser dado.
Excluir-Azure-VM-On-Alert Este runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada são dados de alerta com informações necessárias para identificar qual VM deve parar.

O runbook deve ser chamado a partir de um alerta do Azure por meio de um webhook.

A versão mais recente do módulo Az deve ser adicionada à conta de automação.

A Identidade Gerenciada deve ser habilitada e o acesso do colaborador à conta de automação deve ser dado.
ScaleDown-Azure-VM-On-Alert Este runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada são dados de alerta com informações necessárias para identificar qual VM deve parar.

O runbook deve ser chamado a partir de um alerta do Azure por meio de um webhook.

A versão mais recente do módulo Az deve ser adicionada à conta de automação.

A Identidade Gerenciada deve ser habilitada e o acesso do colaborador à conta de automação deve ser dado.
ScaleUp-Azure-VM-On-Alert Este runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada são dados de alerta com informações necessárias para identificar qual VM deve parar.

O runbook deve ser chamado a partir de um alerta do Azure por meio de um webhook.

A versão mais recente do módulo Az deve ser adicionada à conta de automação.

A Identidade Gerenciada deve ser habilitada e o acesso do colaborador à conta de automação deve ser dado.

Próximos passos