Configurar alertas de estado de funcionamento dos recursos com os modelos do Resource Manager

Este artigo mostra como criar Alertas de Log de Atividades de Integridade de Recursos 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 notificá-lo quase em tempo real quando estes recursos sofrem uma alteração no estado de funcionamento. A criação de alertas de integridade de recursos permite programaticamente que os usuários criem e personalizem alertas em massa.

Nota

Recomendamos que utilize o módulo Azure Az do PowerShell para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. Para saber como migrar para o módulo do Az PowerShell, veja 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 do Azure PowerShell.
  2. Crie ou reutilize um Grupo de Ação 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>
    

    Nota

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

  2. Localize e guarde o ID completo do Azure Resource Manager para o seu Grupo de Ação.

    (Get-AzActionGroup -ResourceGroupName <resourceGroup> -Name <actionGroup>).Id
    
  3. Crie e salve um modelo do Gerenciador de Recursos para alertas de Integridade de Recursos conforme resourcehealthalert.json, consulte Opções de modelo do Gerenciador de Recursos para alertas de Integridade de Recursos.

  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 o ID do Recurso do Grupo de Ações copiados 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 funcionou 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, basta editar o modelo do Gerenciador de Recursos para não solicitar os valores na Etapa 5.

Opções de modelo do Gerenciador de Recursos para alertas de Integridade de Recursos

Você pode usar esse modelo base como ponto de partida para criar alertas de Integridade de Recursos. Este 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.

Nota

Na parte inferior deste artigo, também incluímos um modelo de alerta mais complexo que deve aumentar a relação sinal/ruído para alertas de integridade de recursos em comparação com esse 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 é recomendado. Na seção a seguir, você aprenderá como definir o escopo desse alerta para se concentrar nos eventos que nos interessam.

Ajustar o âmbito do alerta

Os alertas de integridade de recursos podem ser configurados para monitorar eventos em três escopos diferentes:

  • Nível de Subscrição
  • Nível do Grupo de Recursos
  • Nível de recursos

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

Para um escopo de nível de grupo de recursos, a seção de escopos deve ter a seguinte aparência:

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

E para um escopo de nível de recurso, a seção de escopo deve ter a seguinte aparência:

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

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

Nota

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

Ajustar os tipos de recursos que o alertam

Os alertas ao nível da subscrição ou do grupo de recursos podem ter diferentes tipos de recursos. Se você quiser limitar os alertas a apenas provenientes de um determinado subconjunto de tipos de recursos, você pode definir isso na condition seção 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 anyOf wrapper para permitir que o alerta de integridade do recurso corresponda a qualquer uma das condições que especificamos, permitindo alertas direcionados a tipos de recursos específicos.

Ajustando os eventos de Integridade do Recurso que alertam você

Quando os recursos passam por um evento de saúde, eles podem passar por uma série de etapas que representam o estado do evento de saúde: Active, In Progress, Updated, e Resolved.

Você só pode querer ser notificado quando um recurso não estiver íntegro, caso em que você deseja configurar seu alerta para notificar apenas quando o status for Active. No entanto, se você quiser também ser notificado sobre as outras etapas, você pode adicionar esses detalhes como:

"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 saúde, você pode remover essa condição todos juntos, e o alerta notificará você independentemente da status propriedade.

Nota

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

Ajustando os alertas de integridade do recurso 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 estados de saúde relevantes comunicados são: Available, Unavailable, e Degraded. No entanto, em situações em que o corredor e o recurso do Azure não conseguem se comunicar, um status de Unknown integridade é relatado para o recurso e isso é considerado um evento de integridade "Ativo".

No entanto, quando um recurso relata Unknown, é provável que seu status de integridade não tenha mudado desde o último relatório preciso. Se quiser eliminar alertas sobre Unknown eventos, você pode 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 notificando apenas sobre eventos em que o status de integridade atual e anterior não tem Unknown. Esta alteração pode ser uma adição útil se os seus alertas forem enviados diretamente para o seu telemóvel ou e-mail.

É possível que as currentHealthStatus propriedades 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 sobre o evento estejam disponíveis (por exemplo, causa). Portanto, usar a cláusula neste exemplo pode resultar em alguns alertas não sendo acionados, porque os properties.currentHealthStatus valores e properties.previousHealthStatus são definidos como null.

Ajustar o alerta para evitar eventos iniciados pelo utilizador

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

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

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

É possível que o campo cause 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, usar a cláusula neste exemplo pode resultar em um alerta não sendo acionado, porque o valor da properties.cause propriedade será definido como null.

Modelo de alerta Integridade do recurso completo

Aqui está um modelo de exemplo que é configurado usando os ajustes descritos na seção anterior para maximizar a relação sinal/ruído. Tenha em mente as ressalvas mencionadas acima, onde os valores de currentHealthStatuspropriedade , previousHealthStatuse cause 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ê, então use as ferramentas ensinadas nesta documentação para fazer sua própria personalização.

Próximos passos

Saiba mais sobre o Resource Health:

Criar alertas de integridade do serviço: