Compartilhar via


Configurar alertas de integridade de recursos usando modelos do Resource Manager

Este artigo mostra como criar alertas do Log de Atividades do Resource Health programaticamente usando modelos do Azure Resource Manager e o Azure PowerShell.

O Azure Resource Health mantém você informado sobre o status de integridade atual e histórico de seus recursos do Azure. Os alertas do Azure Resource Health podem notificar você quase em tempo real quando esses recursos tiverem uma alteração no seu status de integridade. Criar alertas do Resource Health por meio de programação permite que usuários criem e personalizem alertas em massa.

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

Pré-requisitos

Para seguir as instruções nesta página, você precisa configurar algumas coisas com antecedência:

  1. Instale o módulo PowerShell do Azure .
  2. Criar ou reutilizar um grupo de ações configurado para notificá-lo.

Instruções

  1. Use o PowerShell para fazer logon no Azure usando sua conta e selecione a assinatura com a qual você deseja interagir.

    Login-AzAccount
    Select-AzSubscription -Subscription <subscriptionId>
    

    Observação

    Você pode usar Get-AzSubscription para listar as assinaturas as quais você tem acesso.

  2. Localize e salve a ID completa do Azure Resource Manager para seu Grupo de Ações.

    (Get-AzActionGroup -ResourceGroupName <resourceGroup> -Name <actionGroup>).Id
    
  3. Crie e salve um modelo do Resource Manager para alertas do Resource Health como resourcehealthalert.json, consulte Opções de modelo do Resource Manager para alertas do Resource Health.

  4. Crie uma nova implantação do Azure Resource Manager usando este modelo.

    New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName <resourceGroup> -TemplateFile <path\to\resourcehealthalert.json>
    
  5. Você será solicitado a digitar o nome do alerta e ID de recurso do Grupo de Ações que você copiou anteriormente:

    Supply values for the following parameters:
    (Type !? for Help.)
    activityLogAlertName: <Alert Name>
    actionGroupResourceId: /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/microsoft.insights/actionGroups/<actionGroup>
    
  6. Se tudo funcionar com êxito, você receberá uma confirmação no PowerShell.

    DeploymentName          : ExampleDeployment
    ResourceGroupName       : <resourceGroup>
    ProvisioningState       : Succeeded
    Timestamp               : 11/8/2017 2:32:00 AM
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                            Name                     Type       Value
                            ===============          =========  ==========
                            activityLogAlertName     String     <Alert Name>
                            activityLogAlertEnabled  Bool       True
                            actionGroupResourceId    String     /...
    
    Outputs                 :
    DeploymentDebugLogLevel :
    

Se você estiver planejando automatizar totalmente esse processo, você simplesmente precisará editar o modelo do Resource Manager para não solicitar os valores na etapa 5.

Opções de modelo do Resource Manager para alertas do Resource Health

Você pode usar esse modelo de base como ponto de partida para a criação de alertas do Resource Health. Esse modelo funciona como escrito e inscreve você para receber alertas para todos os eventos de integridade de recursos recém-ativados em todos os recursos em uma assinatura.

Observação

Na parte inferior deste artigo também incluímos um modelo de alerta mais complexo que deve aumentar o sinal para a taxa de ruído para alertas do Resource Health em comparação com este modelo.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "activityLogAlertName": {
      "type": "string",
      "metadata": {
        "description": "Unique name (within the Resource Group) for the Activity log alert."
      }
    },
    "actionGroupResourceId": {
      "type": "string",
      "metadata": {
        "description": "Resource Id for the Action group."
      }
    }
  },
  "resources": [   
    {
      "type": "Microsoft.Insights/activityLogAlerts",
      "apiVersion": "2017-04-01",
      "name": "[parameters('activityLogAlertName')]",      
      "location": "Global",
      "properties": {
        "enabled": true,
        "scopes": [
            "[subscription().id]"
        ],        
        "condition": {
          "allOf": [
            {
              "field": "category",
              "equals": "ResourceHealth"
            },
            {
              "field": "status",
              "equals": "Active"
            }
          ]
        },
        "actions": {
          "actionGroups":
          [
            {
              "actionGroupId": "[parameters('actionGroupResourceId')]"
            }
          ]
        }
      }
    }
  ]
}

No entanto, um alerta amplo como este geralmente não é recomendável. Na seção a seguir, você aprenderá a definir o escopo deste alerta para se concentrar nos eventos com os quais nos preocupamos.

Ajustando o escopo de alerta

Os alertas do Resource Health podem ser configurados para monitorar eventos em três escopos diferentes:

  • Nível de Assinatura
  • Nível do Grupo de Recursos
  • Nível do recurso

O modelo de alerta está configurado no nível da assinatura, mas se você quiser configurar o alerta para notificá-lo apenas sobre determinados recursos ou recursos em um determinado grupo de recursos, basta modificar a seção scopes neste modelo.

Para um escopo de nível de grupo de recursos, a seção de escopos deve se parecer com:

"scopes": [
    "/subscriptions/<subscription id>/resourcegroups/<resource group>"
],

E, para um escopo de nível de recursos, a seção de escopos deve se parecer com:

"scopes": [
    "/subscriptions/<subscription id>/resourcegroups/<resource group>/providers/<resource>"
],

Por exemplo: "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myRG/providers/microsoft.compute/virtualmachines/myVm"

Observação

Você pode acessar o Portal do Azure e examinar a URL ao exibir o recurso do Azure para obter essa cadeia de caracteres.

Ajustar os tipos de recursos que alertam você

Os alertas no nível de grupo de recursos ou assinatura podem ter diferentes tipos de recursos. Se quiser limitar os alertas para serem provenientes apenas de um certo subconjunto de tipos de recursos, você poderá definir isso na seção condition do modelo da seguinte forma:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "resourceType",
                    "equals": "MICROSOFT.COMPUTE/VIRTUALMACHINES",
                    "containsAny": null
                },
                {
                    "field": "resourceType",
                    "equals": "MICROSOFT.STORAGE/STORAGEACCOUNTS",
                    "containsAny": null
                },
                ...
            ]
        }
    ]
},

Aqui, usamos o wrapper anyOf para permitir que o alerta de integridade de recurso corresponda a qualquer uma das condições que especificamos, permitindo os alertas que se destinam a tipos específicos de recursos.

Ajustar os eventos do Resource Health que alertam você

Quando recursos passam por um evento de integridade, eles podem passar por uma série de estágios que representa o estado do evento de integridade: Active, In Progress, Updated e Resolved.

Você pode deseja ser notificado apenas quando um recurso se tornar não íntegro, caso em que você deseja configurar o alerta para notificar somente quando status for Active. No entanto se quiser também ser notificado sobre os outros estágios, você poderá adicionar esses detalhes da seguinte forma:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "status",
                    "equals": "Active"
                },
                {
                    "field": "status",
                    "equals": "In Progress"
                },
                {
                    "field": "status",
                    "equals": "Resolved"
                },
                {
                    "field": "status",
                    "equals": "Updated"
                }
            ]
        }
    ]
}

Se você quiser ser notificado para todos os quatro estágios de eventos de integridade, poderá remover essa condição juntos e o alerta notificará você independentemente da propriedade status.

Observação

Cada seção "anyOf" deve conter apenas um valor de tipo de campo.

Ajustar os alertas do Resource Health para evitar eventos "desconhecidos"

O Azure Resource Health pode relatar a integridade mais recente de seus recursos monitorando-os constantemente usando executores de teste. Os status de integridade relatados relevantes são: Available, Unavailable e Degraded. No entanto, em situações em que o executor e o recurso do Azure não conseguem se comunicar, um status de integridade Unknown é relatado para o recurso e é considerado um evento de integridade "Ativo".

No entanto, quando um recurso relata Unknown, é provável que seu status de integridade não tenha sido alterado desde o último relatório preciso. Se você quiser eliminar alertas em eventos Unknown, poderá especificar essa lógica no modelo:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Available",
                    "containsAny": null
                },
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Unavailable",
                    "containsAny": null
                },
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Degraded",
                    "containsAny": null
                }
            ]
        },
        {
            "anyOf": [
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Available",
                    "containsAny": null
                },
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Unavailable",
                    "containsAny": null
                },
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Degraded",
                    "containsAny": null
                }
            ]
        },
    ]
},

Neste exemplo, estamos apenas notificando os eventos em que o status de integridade atual e anterior não tem Unknown. Essa alteração poderá ser uma adição útil se os alertas forem enviados diretamente ao seu celular ou email.

É possível que as propriedades currentHealthStatus e previousHealthStatus sejam nulas em alguns eventos. Por exemplo, quando ocorre um evento atualizado, é provável que o status de integridade do recurso não tenha sido alterado desde o último relatório, apenas que mais informações de evento estão disponíveis (por exemplo, causa). Portanto, o uso da cláusula neste exemplo pode resultar em alguns alertas não sendo disparados, pois os valores properties.currentHealthStatus e properties.previousHealthStatus são definidos como nulos.

Ajustar o alerta para evitar eventos iniciados pelo usuário

Os eventos do Resource Health podem ser disparados por eventos iniciados pela plataforma e pelo usuário. Pode fazer sentido enviar apenas uma notificação quando o evento de integridade for causado pela plataforma do Azure.

É fácil configurar o alerta para filtrar apenas esses tipos de eventos:

"condition": {
    "allOf": [
        ...,
        {
            "field": "properties.cause",
            "equals": "PlatformInitiated",
            "containsAny": null
        }
    ]
}

É possível que o campo de causa seja nulo em alguns eventos. Ou seja, ocorre uma transição de integridade (por exemplo, disponível para indisponível) e o evento é registrado imediatamente para evitar atrasos de notificação. Portanto, o uso da cláusula neste exemplo pode resultar em um alerta não sendo disparado, pois o valor da propriedade properties.cause será definido como nulo.

Modelo de alerta concluído do Resource Health

Aqui está um modelo de exemplo configurado usando os ajustes descritos na seção anterior para maximizar a taxa de ruído para o sinal. Tenha em mente as advertências indicadas acima, em que os valores de propriedade currentHealthStatus, previousHealthStatus e causa podem ser nulos em alguns eventos.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "activityLogAlertName": {
            "type": "string",
            "metadata": {
                "description": "Unique name (within the Resource Group) for the Activity log alert."
            }
        },
        "actionGroupResourceId": {
            "type": "string",
            "metadata": {
                "description": "Resource Id for the Action group."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Insights/activityLogAlerts",
            "apiVersion": "2017-04-01",
            "name": "[parameters('activityLogAlertName')]",
            "location": "Global",
            "properties": {
                "enabled": true,
                "scopes": [
                    "[subscription().id]"
                ],
                "condition": {
                    "allOf": [
                        {
                            "field": "category",
                            "equals": "ResourceHealth",
                            "containsAny": null
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Available",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Unavailable",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Degraded",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Available",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Unavailable",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Degraded",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.cause",
                                    "equals": "PlatformInitiated",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "status",
                                    "equals": "Active",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "Resolved",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "In Progress",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "Updated",
                                    "containsAny": null
                                }
                            ]
                        }
                    ]
                },
                "actions": {
                    "actionGroups": [
                        {
                            "actionGroupId": "[parameters('actionGroupResourceId')]"
                        }
                    ]
                }
            }
        }
    ]
}

No entanto, você sabe melhor quais configurações são eficazes para você, portanto, use as ferramentas ensinadas nesta documentação para fazer sua própria personalização.

Próximas etapas

Saiba mais sobre o Resource Health:

Criar alertas de Integridade do Serviço: