Configuración de alertas de estado de los recursos con plantillas de Resource Manager

En este artículo se muestra cómo crear alertas del registro de actividad de Resource Health mediante programación con plantillas de Azure Resource Manager y Azure PowerShell.

Azure Resource Health le mantiene informado sobre el estado actual y pasado de sus recursos de Azure. Además, le notifica casi en tiempo real de los cambios de estado en estos recursos. La creación y la personalización de alertas mediante programación en Resource Health se puede realizar en bloque.

Nota:

Se recomienda usar el módulo Azure Az de PowerShell para interactuar con Azure. Para comenzar, consulte Instalación de Azure PowerShell. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Requisitos previos

Para seguir las instrucciones que aparecen en esta página, debe llevar a cabo algunos procesos anticipadamente:

  1. Instale el módulo de Azure PowerShell.
  2. Cree o vuelva a usar un grupo de acciones configurado para recibir notificaciones.

Instrucciones

  1. Con PowerShell, inicie sesión en su cuenta de Azure y seleccione la suscripción con la que desee interactuar.

    Login-AzAccount
    Select-AzSubscription -Subscription <subscriptionId>
    

    Nota:

    Puede usar Get-AzSubscription para enumerar las suscripciones a las que tiene acceso.

  2. Busque y guarde el identificador completo del grupo de acciones de Azure Resource Manager.

    (Get-AzActionGroup -ResourceGroupName <resourceGroup> -Name <actionGroup>).Id
    
  3. Cree y guarde una plantilla de Resource Manager para las alertas de Resource Health como resourcehealthalert.json, consulte Opciones de plantilla de Resource Manager para alertas de Resource Health.

  4. Cree una nueva implementación de Azure Resource Manager con esta plantilla.

    New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName <resourceGroup> -TemplateFile <path\to\resourcehealthalert.json>
    
  5. Se le pedirá que escriba el nombre de la alerta y el identificador de recurso del grupo de acciones que copió anteriormente:

    Supply values for the following parameters:
    (Type !? for Help.)
    activityLogAlertName: <Alert Name>
    actionGroupResourceId: /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/microsoft.insights/actionGroups/<actionGroup>
    
  6. Si todo fue bien, recibirá una confirmación en 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 :
    

Si planea automatizar completamente este proceso, basta con editar la plantilla de Resource Manager para que no solicite los valores del paso 5.

Opciones de la plantilla de Resource Manager para las alertas de Resource Health

Para crear alertas de Resource Health puede usar esta plantilla base como punto de partida. Esta plantilla funcionará como se escriba y le permitirá recibir alertas de todos los eventos de estado de recurso que se activen a partir de ese momento en los recursos de una suscripción.

Nota:

En la parte inferior de este artículo hemos incluido también una plantilla de alerta más compleja que debe aumentar la relación señal/ruido de las alertas de Resource Health en comparación con esta plantilla.

{
  "$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')]"
            }
          ]
        }
      }
    }
  ]
}

Sin embargo, una alerta amplia como esta no suele ser recomendable. En la sección siguiente, aprenderá a reducir el ámbito para que la alerta se centre en los eventos que nos importan.

Ajuste del ámbito de alerta

Las alertas de Resource Health se pueden configurar para supervisar eventos en tres ámbitos distintos:

  • Nivel de suscripción
  • A nivel de grupo de recursos
  • Nivel de recurso

La plantilla de alerta se configura a nivel de suscripción, pero si desea configurarla para que solo se notifiquen determinados recursos o recursos de un determinado grupo, basta con modificar la sección scopes de esta plantilla.

Para un ámbito a nivel de grupo de recursos, la sección de ámbito tiene este aspecto:

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

Para un ámbito a nivel de recurso, la sección de ámbito tiene este aspecto:

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

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

Nota:

Puede ir a Azure Portal y observar la dirección URL del recurso de Azure para obtener esta cadena.

Ajuste de los tipos de recursos con alertas

Las alertas a nivel de suscripción o de grupo de recursos tienen distintos tipos de recursos. Si desea limitar las alertas a las que procedan de un determinado subconjunto de tipos de recursos, puede definirlo en la sección condition de la plantilla de este modo:

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

Aquí usamos el contenedor anyOf para permitir que la alerta de estado de recurso coincida con cualquiera de las condiciones especificadas para las alertas se centren en determinados tipos de recursos.

Ajuste de los eventos de Resource Health con alerta

Cuando se produce un evento de estado en los recursos, pueden pasar por una serie de fases que representan el estado del evento: Active, In Progress, Updated y Resolved.

Quizá solo desee recibir notificaciones en caso de que el estado del recurso sea incorrecto, para lo que querrá configurar la alerta para notificar solo cuando status sea Active. Sin embargo si desea recibir una notificación también en las otras fases, puede agregar esos detalles de este modo:

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

Si desea recibir una notificación para las cuatro fases de los eventos de estado, elimine esta condición y la alerta le notificará independientemente de la propiedad status.

Nota:

Cada sección "anyOf" debe contener solo un valor de tipo de campo.

Ajuste de las alertas de Resource Health para evitar eventos desconocidos

Azure Resource Health puede notificar el estado más reciente de los recursos gracias a la constante supervisión mediante ejecutores de pruebas. Los estados de mantenimiento notificados pertinentes son: Available, Unavailable y Degraded. Sin embargo, en situaciones en las que el ejecutor y el recurso de Azure no se pueden comunicar, se notifica un estado Unknown para el recurso y que se considera un evento de estado "Activo".

No obstante, cuando un recurso se notifica como Unknown, es probable que su estado no haya cambiado desde el último informe preciso. Si desea eliminar las alertas de eventos Unknown, puede especificar esa lógica en la plantilla:

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

En este ejemplo, solo se notifican los eventos en los que el estado actual y anterior no son Unknown. Este cambio puede resultar útil si las alertas se envían directamente al correo electrónico o teléfono móvil.

Es posible que las propiedades currentHealthStatus y previousHealthStatus sean un valor nulo en algunos eventos. Por ejemplo, cuando se produce un evento Updated, es probable que el estado de mantenimiento del recurso no haya cambiado desde el último informe y solo está disponible esa información adicional del evento (por ejemplo, la causa). Por lo tanto, el uso de la cláusula en este ejemplo puede provocar que algunas alertas no se desencadenen, ya que los valores de properties.currentHealthStatus y properties.previousHealthStatus se establecen en el valor nulo.

Ajuste de la alerta para evitar eventos iniciados por el usuario

Los eventos de Resource Health se pueden desencadenar mediante eventos iniciados por la plataforma o por el usuario. Puede que tenga sentido solo enviar una notificación cuando el evento lo genere la plataforma Azure.

Es fácil de configurar la alerta para filtrar solo estos tipos de eventos:

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

Es posible que el campo de la causa sea un valor nulo en algunos eventos. Es decir, una transición de estado tiene lugar (por ejemplo, pasa de disponible a no disponible) y el evento se registra inmediatamente a fin de evitar que la notificación se retrase. Por lo tanto, mediante la cláusula de este ejemplo puede provocar que una alerta no se desencadene, ya que el valor de la propiedad properties.cause se establecerá en el valor nulo.

Completar la plantilla de alerta de Resource Health

Esta es una plantilla de ejemplo que se configura mediante los ajustes descritos en la sección anterior para maximizar la relación de señal a ruido. Tenga en cuenta las observaciones que se han indicado anteriormente donde los valores de las propiedades currentHealthStatus, previousHealthStatus y cause pueden ser nulos en algunos 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')]"
                        }
                    ]
                }
            }
        }
    ]
}

Sin embargo, usted conoce mejor las configuraciones que necesita; use las herramientas que le hemos mostrado en esta documentación para la personalización.

Pasos siguientes

Más información sobre Resource Health:

Creación de alertas de Service Health: