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

Você pode usar o Azure Monitor para monitorar logs e métricas de nível básico para a maioria dos serviços no Azure. Você pode chamar os runbooks da Automação do Azure usando grupos de ações 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 log de atividades
  • Alertas de métrica quase em tempo real

Observação

O esquema de alerta comum padroniza a experiência de consumo para notificações de alerta no Azure. Historicamente, os três tipos de alertas no Azure (métrica, log e log de atividades) têm seus próprios modelos de email, esquemas de webhook etc. Para saber mais, confiraEsquema 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 com o formato JSON que tem propriedades úteis relacionadas ao alerta. A tabela a seguir lista links para o esquema de conteúdo para cada tipo de alerta:

Alerta Descrição Esquema de conteúdo
Alertas comuns O esquema de alerta comum que padroniza a experiência de consumo para notificações de alerta no Azure hoje. Esquema de conteúdo de alerta comum.
Alerta do log 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 operação Delete VM ocorre em myProductionResourceGroup ou quando um novo evento da Integridade do Serviço do Azure com um status Ativo é exibido. Esquema de conteúdo de alerta de log de atividades
Alertas de métrica quase em tempo real Envia uma notificação mais rápido do que alertas de métrica quando uma ou mais métricas de nível de plataforma atendem às condições especificadas. Por exemplo, quando o valor de % de CPU em uma VM é maior que 90 e o valor de Entrada de Rede é maior do que 500 MB para os últimos 5 minutos. Esquema de conteúdo de alerta de métrica quase em tempo real

Já que os dados fornecidos por cada 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 adequada para permitir que ela pare e inicie uma máquina virtual. O runbook pode usar a identidade gerenciada atribuída pelo sistema ou uma identidade gerenciada atribuída pelo usuário da conta de Automação. As etapas são fornecidas para atribuir permissões a cada identidade. As etapas abaixo usam o PowerShell. Se você preferir usar o Portal, confira Atribuir funções do Azure usando o portal do Azure.

  1. Entre no Azure de modo interativo 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 pelo sistema.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "DevTest Labs User"
    
  4. Atribuir 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 pelo sistema, mostre ClientId e grave o valor para uso posterior.

    $UAMI.ClientId
    

Criar um runbook para tratar alertas

Para usar a Automação com alertas, será necessário um runbook que gerencie o conteúdo JSON de alerta que é passado ao runbook. O seguinte exemplo de runbook deverá 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 aceita os dados de webhook de um alerta no parâmetro de entrada do runbook WebhookData. Em seguida, o script avalia o conteúdo de JSON para determinar qual tipo de alerta está sendo usado.

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

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

Observação

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 disparar um webhook de Automação quando a conta de Automação estiver usando links privados e for 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 da Automação.

  2. Em Automação de Processo, 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 pelo sistema, deixe o código no estado em que se encontra. Se você preferir usar uma identidade gerenciada atribuída pelo usuário, então:

    1. Na linha 78, remova $AzureContext = (Connect-AzAccount -Identity).context,
    2. Substitua-o por $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context e
    3. Insira a ID de cliente obtida anteriormente.
  6. Clique em Salvar, em Publicar e 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 coleções de ações disparadas pelo alerta. Runbooks são apenas uma das muitas ações que você pode usar com grupos de ações.

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

  2. Selecione + Novo 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 virtual(s) que você deseja monitorar. Em seguida, selecione Feito para retornar à página Criar regra de alerta.

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

  7. Na página Selecionar um sinal, insira Percentage CPU na caixa de texto de pesquisa e selecione Percentual de CPU nos resultados.

  8. Na página Configurar lógica de sinal, em Valor 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 Feito 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. A página Criar grupo de ações:

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

    2. Na guia Ações, na caixa de texto Nome, digite um nome. Em seguida, na lista suspensa do 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 da Assinatura, selecione sua assinatura.

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

      4. Na lista suspensa do 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 Revisar + criar e, e sem seguida Criar para retornar à 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 este grupo de ações nos alertas de log de atividades e alertas quase em tempo real que você criar.

Verificação

Certifique-se de que sua VM está em execução. Navegue até o runbook Stop-AzureVmInResponsetoVMAlert e observe a lista a ser preenchida de Trabalhos Recentes. Depois que um trabalho concluído aparecer, selecione o trabalho e revise a saída. Verifique também se sua VM foi interrompida.

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 reinicializar VM, parar VM, excluir VM, cenários de dimensionamento vertical e horizontal na galeria de runbooks. Os scripts também podem ser encontrados no repositório do GitHub da 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 Esse runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada é dados de alerta com as informações necessárias para identificar qual VM deve ser interrompida.

O runbook precisa ser chamado 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 de colaborador à conta de automação deve ser fornecido.
Restart-Azure-VM-On-Alert Esse runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada é dados de alerta com as informações necessárias para identificar qual VM deve ser interrompida.

O runbook precisa ser chamado 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 de colaborador à conta de automação deve ser fornecido.
Delete-Azure-VM-On-Alert Esse runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada é dados de alerta com as informações necessárias para identificar qual VM deve ser interrompida.

O runbook precisa ser chamado 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 de colaborador à conta de automação deve ser fornecido.
ScaleDown-Azure-VM-On-Alert Esse runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada é dados de alerta com as informações necessárias para identificar qual VM deve ser interrompida.

O runbook precisa ser chamado 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 de colaborador à conta de automação deve ser fornecido.
ScaleUp-Azure-VM-On-Alert Esse runbook interromperá uma VM do Azure Resource Manager em resposta a um gatilho de alerta do Azure.

A entrada é dados de alerta com as informações necessárias para identificar qual VM deve ser interrompida.

O runbook precisa ser chamado 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 de colaborador à conta de automação deve ser fornecido.

Próximas etapas