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

Este artigo mostrará como criar alertas de log de atividade 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 do Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. 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ê precisará configurar algumas coisas com antecedência:

  1. Você precisa instalar o módulo do Azure PowerShell
  2. Você precisa criar ou reutilizar um Grupo de Ação configurado para notificá-lo

Instruções

  1. Usando o PowerShell, faça logon no Azure usando sua conta e selecione a assinatura com a qual você deseja interagir

    Login-AzAccount
    Select-AzSubscription -Subscription <subscriptionId>
    

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

  2. Localizar e guardar 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 como resourcehealthalert.json (veja os detalhes abaixo)

  4. Criar 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 sucesso, 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 :
    

Observe que, 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 funcionará como escrito e irá inscrevê-lo para receber alertas para todos os eventos de integridade de recursos recém-ativados em todos os recursos em uma assinatura.

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. Saiba como podemos definir o escopo deste alerta para nos concentrarmos nos eventos que nos interessam abaixo.

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 no modelo acima.

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/d37urb3e-ed41-4670-9c19-02a1d2808ff9/resourcegroups/myRG/providers/microsoft.compute/virtualmachines/myVm"

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 wrapper para permitir que o anyOf 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 ProgressUpdated, 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 irá notificá-lo independentemente da status propriedade.

Nota

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

Ajustar os alertas de Estado de Funcionamento 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: "Disponível", "Indisponível" e "Degradado". No entanto, em situações em que o corredor e o recurso do Azure não conseguem se comunicar, um status de integridade "Desconhecido" é relatado para o recurso e isso é considerado um evento de integridade "Ativo".

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

Observe que é 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 informações adicionais do evento estejam disponíveis (por exemplo, causa). Portanto, usar a cláusula acima pode resultar em alguns alertas não sendo acionados, porque os valores properties.currentHealthStatus e properties.previousHealthStatus serão definidos como null.

Ajustando o alerta para evitar eventos iniciados pelo usuário

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
        }
    ]
}

Observe que é 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 na notificação. Portanto, usar a cláusula acima pode resultar em um alerta não sendo acionado, porque o valor da propriedade properties.cause será definido como null.

Modelo de alerta Integridade do recurso completo

Usando os diferentes ajustes descritos na seção anterior, aqui está um modelo de exemplo que é configurado para maximizar a relação sinal/ruído. Tenha em mente as advertências observadas acima, onde os valores de propriedade currentHealthStatus, previousHealthStatus e 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ê saberá 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: