Compartir a través de


Tutorial: Enrutamiento de eventos de cambio de estado de directivas a Event Grid con la CLI de Azure

En este artículo, aprenderá a configurar las suscripciones a eventos de Azure Policy para enviar eventos de cambio de estado de directivas a un punto de conexión web. Los usuarios de Azure Policy pueden suscribirse a los eventos emitidos cuando se producen cambios en el estado de la directiva en los recursos. Estos eventos pueden desencadenar webhooks, instancias de Azure Functions, colas de Azure Storage o cualquier otro controlador de eventos que sea compatible con Azure Event Grid. Por lo general, se envían eventos a un punto de conexión que procesa los datos del evento y realiza acciones. Sin embargo, para simplificar este tutorial, los eventos se envían a una aplicación web que recopila y muestra los mensajes.

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • Para realizar este inicio rápido es necesaria la versión 2.0.76 o superior de la CLI de Azure. Para encontrar la versión, ejecute az --version. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador. Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.

Para iniciar Azure Cloud Shell:

Opción Ejemplo o vínculo
Seleccione Pruébelo en la esquina superior derecha de un bloque de código o de comandos. Solo con seleccionar Pruébelo no se copia automáticamente el código o comando en Cloud Shell. Captura de pantalla que muestra un ejemplo de la opción Pruébelo para Azure Cloud Shell.
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador. Botón para iniciar Azure Cloud Shell.
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal. Captura de pantalla que muestra el botón de Cloud Shell en Azure Portal

Para usar Azure Cloud Shell:

  1. Inicie Cloud Shell.

  2. Seleccione el botón Copiar en un bloque de código (o bloque de comandos) para copiar el código o comando.

  3. Pegue el código o comando en la sesión de Cloud Shell. Para ello, seleccione Ctrl+Mayús+V en Windows y Linux, o bien seleccione Cmd+Mayús+V en macOS.

  4. Seleccione Enter para ejecutar el código o comando.

Crear un grupo de recursos

Los temas de Event Grid son recursos de Azure y se deben colocar en un grupo de recursos de Azure. El grupo de recursos de Azure es una colección lógica en la que se implementan y administran los recursos de Azure.

Para crear un grupo de recursos, use el comando az group create.

En el ejemplo siguiente se crea un grupo de recursos llamado <resource_group_name> en la ubicación eastus. Reemplace <resource_group_name> por un nombre único para grupo de recursos.

# Log in first with az login if you're not using Cloud Shell

az group create --name <resource_group_name> --location westus

Creación de un tema del sistema de Event Grid

Ahora que tenemos un grupo de recursos, vamos a crear un tema del sistema. Un tema del sistema en Event Grid representa uno o varios eventos publicados por los servicios de Azure, como Azure Policy y Azure Event Hubs. Este tema del sistema usa el tipo de tema Microsoft.PolicyInsights.PolicyStates para los cambios de estado de Azure Policy.

En primer lugar, deberá registrar los proveedores de recursos PolicyInsights y EventGrid en el ámbito de administración adecuado. Aunque Azure Portal registra automáticamente los proveedores de recursos que usted invoque por primera vez, la CLI de Azure no lo hace.

# Log in first with az login if you're not using Cloud Shell

# Register the required RPs at the management group scope
az provider register --namespace Microsoft.PolicyInsights -m <managementGroupId>
az provider register --namespace Microsoft.EventGrid -m <managementGroupId>

# Alternatively, register the required RPs at the subscription scope (defaults to current subscription context)
az provider register --namespace Microsoft.PolicyInsights
az provider register --namespace Microsoft.EventGrid

Después, reemplace <subscriptionId> en el parámetro scope por el identificador de la suscripción y <resource_group_name> en el parámetro resource-group por el grupo de recursos creado anteriormente.

az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/subscriptions/<subscriptionId>" --resource-group "<resource_group_name>"

Si el tema del sistema de Event Grid se aplica al ámbito del grupo de administración, la sintaxis del parámetro --source de la CLI de Azure será un poco diferente. Este es un ejemplo:

az eventgrid system-topic create --name PolicyStateChanges --location global --topic-type Microsoft.PolicyInsights.PolicyStates --source "/tenants/<tenantID>/providers/Microsoft.Management/managementGroups/<management_group_name>" --resource-group "<resource_group_name>"

Creación de un punto de conexión de mensaje

Antes de suscribirse al tema, vamos a crear el punto de conexión para el mensaje de evento. Normalmente, el punto de conexión realiza acciones en función de los datos del evento. Para simplificar esta guía de inicio rápido, se implementa una aplicación web pregenerada que muestra los mensajes de los eventos. La solución implementada incluye un plan de App Service, una aplicación web de App Service y el código fuente desde GitHub.

Reemplace <your-site-name> por un nombre único para la aplicación web. El nombre de la aplicación web debe ser único, ya que es parte de la entrada DNS.

# Log in first with az login if you're not using Cloud Shell

az deployment group create \
  --resource-group <resource_group_name> \
  --template-uri "https://raw.githubusercontent.com/Azure-Samples/azure-event-grid-viewer/master/azuredeploy.json" \
  --parameters siteName=<your-site-name> hostingPlanName=viewerhost

La implementación puede tardar unos minutos en completarse. Después de que la implementación se haya realizado correctamente, puede ver la aplicación web para asegurarse de que se está ejecutando. En un explorador web, vaya a: https://<your-site-name>.azurewebsites.net

Debería ver el sitio, que no muestra ningún mensaje actualmente.

Suscripción al tema del sistema

Suscríbase a un tema que indique a Event Grid los eventos cuyo seguimiento desea realizar y el lugar al que deben enviarse dichos eventos. El ejemplo siguiente se suscribe al tema personalizado que ha creado y pasa la dirección URL de la aplicación web como el punto de conexión para recibir notificaciones de eventos. Reemplace <event_subscription_name> por un nombre para la suscripción de eventos. En <resource_group_name> y <your-site-name>, use los valores que creó anteriormente.

El punto de conexión de la aplicación web debe incluir el sufijo /api/updates/.

# Log in first with az login if you're not using Cloud Shell

# Create the subscription
az eventgrid system-topic event-subscription create \
  --name <event_subscription_name> \
  --resource-group <resource_group_name> \
  --system-topic-name PolicyStateChanges \
  --endpoint https://<your-site-name>.azurewebsites.net/api/updates

Vuelva a la aplicación web y observe que se ha enviado un evento de validación de suscripción. Seleccione el icono del ojo para expandir los datos del evento. Event Grid envía el evento de validación para que el punto de conexión pueda verificar que desea recibir datos de eventos. La aplicación web incluye código para validar la suscripción.

Captura de pantalla del evento de validación de la suscripción de Event Grid en la aplicación web creada previamente.

Creación de una asignación de directiva

En esta guía de inicio rápido, creará una asignación de directiva y asignará la definición Requerir una etiqueta en los grupos de recursos. Esta definición de directiva identifica los grupos de recursos a los que les falta configurar la etiqueta durante la asignación de directivas.

Ejecute el siguiente comando para crear una asignación de directiva cuyo ámbito sea el grupo de recursos que ha creado para contener el tema de Event Grid:

# Log in first with az login if you're not using Cloud Shell

az policy assignment create --name 'requiredtags-events' --display-name 'Require tag on RG' --scope '<resourceGroupScope>' --policy '<policy definition ID>' --params '{ \"tagName\": { \"value\": \"EventTest\" } }'

El comando anterior usa la siguiente información:

  • Nombre: el nombre real de la asignación. Para este ejemplo se ha utilizado requiredtags-events.
  • DisplayName: nombre para mostrar de la asignación de directiva. En este caso, va a utilizar Requerir una etiqueta en los grupos de recursos.
  • Scope: un ámbito determina en qué recursos o agrupación de recursos se aplica la asignación de directiva. Puede abarcar desde una suscripción hasta grupos de recursos. Asegúrese de sustituir <scope> por el nombre del grupo de recursos. El formato de un ámbito de grupo de recursos es /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>.
  • Directiva: identificador de la definición de directiva, según la opción utilizada para crear la asignación. En este caso, es el identificador de la definición de directiva Requerir una etiqueta en los grupos de recursos. Para obtener el identificador de definición de directiva, ejecute este comando: az policy definition list --query "[?displayName=='Require a tag on resource groups']"

Después de crear la asignación de directiva, espere a que aparezca en la aplicación web la notificación de eventos Microsoft.PolicyInsights.PolicyStateCreated. El grupo de recursos creado muestra el valor NonCompliant para data.complianceState en el inicio.

Captura de pantalla del evento de creación de estado de directiva de la suscripción de Event Grid para el grupo de recursos en la aplicación web creada previamente.

Nota

Si el grupo de recursos hereda otras asignaciones de directiva de la suscripción o de la jerarquía de grupos de administración, también se muestran los eventos de cada uno de ellos. Confirme que el evento corresponde a la asignación de este tutorial mediante la evaluación de la propiedad data.policyDefinitionId.

Desencadenamiento de un cambio en el grupo de recursos

Para que el grupo de recursos sea compatible, se requiere una etiqueta con el nombre EventTest. Agregue la etiqueta al grupo de recursos con el siguiente comando; para ello, reemplace <subscriptionId> por el identificador de la suscripción y <resourceGroup> por el nombre del grupo de recursos:

# Log in first with az login if you're not using Cloud Shell

az tag create --resource-id '/subscriptions/<SubscriptionID>/resourceGroups/<resourceGroup>' --tags EventTest=true

Después de agregar la etiqueta necesaria al grupo de recursos, espere a que aparezca en la aplicación web la notificación de eventos Microsoft.PolicyInsights.PolicyStateChanged. Al expandir el evento, ahora data.complianceState muestra el valor Compliant.

Solución de problemas

Si ve un error similar a uno de los siguientes, asegúrese de que ha registrado ambos proveedores de recursos en el ámbito al que se va a suscribir (grupo de administración o suscripción):

  • Deployment has failed with the following error: {"code":"Publisher Notification Error","message":"Failed to enable publisher notifications.","details":[{"code":"Publisher Provider Error","message":"GET request for <uri> failed with status code: Forbidden, code: AuthorizationFailed and message: The client '<identifier>' with object id '<identifier>' does not have authorization to perform action 'microsoft.policyinsights/eventGridFilters/read' over scope '<scope>/providers/microsoft.policyinsights/eventGridFilters/_default' or the scope is invalid. If access was recently granted, please refresh your credentials.."}]}
  • Deployment has failed with the following error: {'code':'Publisher Notification Error','message':'Failed to enable publisher notifications.','details':[{'code':'ApiVersionNotSupported','message':'Event Grid notifications are currently not supported by microsoft.policyinsights in global. Try re-registering Microsoft.EventGrid provider if this is your first event subscription in this region.'}]}

Limpieza de recursos

Si planea seguir trabajando con esta aplicación web y la suscripción a eventos de Azure Policy, no elimine los recursos creados en este artículo. Si no va a continuar, use el siguiente comando para eliminar los recursos creados en este artículo.

Sustituya <resource_group_name> por el nombre del grupo de recursos que ha creado.

az group delete --name <resource_group_name>

Pasos siguientes

Ahora que sabe cómo crear temas y suscripciones a eventos, puede obtener información sobre los eventos de cambio de estado de directivas y lo que Event Grid puede ayudarle a hacer: