Recibir notificaciones de cambio a través de Azure Event Hubs

Es posible que los webhooks no sean adecuados para recibir notificaciones de cambio en escenarios de alto rendimiento o cuando el receptor no pueda exponer una dirección URL de notificación disponible públicamente. Como alternativa, puede usar Azure Event Hubs.

Algunos ejemplos de escenarios de alto rendimiento son las aplicaciones que se suscriben a un gran conjunto de recursos, las aplicaciones que se suscriben a recursos que cambian con una frecuencia alta y las aplicaciones multiinquilino que se suscriben a recursos en un gran conjunto de organizaciones.

El artículo le guía por el proceso de administración de la suscripción de Microsoft Graph y cómo recibir notificaciones de cambios a través de Azure Event Hubs.

Usar Azure Event Hubs para recibir notificaciones de cambios

Azure Event Hubs es un conocido servicio de distribución y recopilación de eventos en tiempo real creado para escalar. Puede usar Azure Events Hubs en lugar de los webhooks tradicionales para recibir notificaciones de cambios.
El uso de Azure Event Hubs para recibir notificaciones de cambios difiere de las webhooks de varias maneras, entre las que se incluyen:

  • No se basan en URL de notificación expuestos públicamente. El SDK de Event hubs retransmitirá las notificaciones a la aplicación.
  • No es necesario responder a la validación de URL de notificación. Puede ignorar el mensaje de validación que recibe.
  • Tendrá que aprovisionar un Azure Event Hub.
  • Tendrá que aprovisionar un Azure Key Vault.

Configure Azure KeyVault y Azure Event Hubs

Esta sección le guiará a través de la configuración de los servicios de Azure necesarios.

El CLI de Azure le permite ejecutar scripts y automatizar tareas administrativas en Azure. La CLI se puede instalar en el equipo local o ejecutarse directamente desde Azure Cloud Shell.

# --------------
# TODO: update the following values
#sets the name of the resource group
resourcegroup=rg-graphevents-dev
#sets the location of the resources
location='uk south'
#sets the name of the Azure Event Hubs namespace
evhamespacename=evh-graphevents-dev
#sets the name of the hub under the namespace
evhhubname=graphevents
#sets the name of the access policy to the hub
evhpolicyname=grapheventspolicy
#sets the name of the Azure KeyVault
keyvaultname=kv-graphevents
#sets the name of the secret in Azure KeyVault that will contain the connection string to the hub
keyvaultsecretname=grapheventsconnectionstring
# --------------
az group create --location $location --name $resourcegroup
az eventhubs namespace create --name $evhamespacename --resource-group $resourcegroup --sku Basic --location $location
az eventhubs eventhub create --name $evhhubname --namespace-name $evhamespacename --resource-group $resourcegroup --partition-count 2 --message-retention 1
az eventhubs eventhub authorization-rule create --name $evhpolicyname --eventhub-name $evhhubname --namespace-name $evhamespacename --resource-group $resourcegroup --rights Send
evhprimaryconnectionstring=`az eventhubs eventhub authorization-rule keys list --name $evhpolicyname --eventhub-name $evhhubname --namespace-name $evhamespacename --resource-group $resourcegroup --query "primaryConnectionString" --output tsv`
az keyvault create --name $keyvaultname --resource-group $resourcegroup --location $location --enable-soft-delete true --sku standard --retention-days 90
az keyvault secret set --name $keyvaultsecretname --value $evhprimaryconnectionstring --vault-name $keyvaultname --output none
graphspn=`az ad sp list --display-name 'Microsoft Graph Change Tracking' --query "[].appId" --output tsv`
az keyvault set-policy --name $keyvaultname --resource-group $resourcegroup --secret-permissions get --spn $graphspn --output none
keyvaulturi=`az keyvault show --name $keyvaultname --resource-group $resourcegroup --query "properties.vaultUri" --output tsv`
domainname=`az ad signed-in-user show --query 'userPrincipalName' | cut -d '@' -f 2 | sed 's/\"//'`
notificationUrl="EventHub:${keyvaulturi}secrets/${keyvaultsecretname}?tenantId=${domainname}"
echo "Notification Url:\n${notificationUrl}"

Nota: El script proporcionado aquí es compatible con shells basados en Linux, Windows WSL y Azure Cloud Shell. Se requieren algunas actualizaciones para ejecutarse en shells de Windows.

Crear la suscripción y recibir notificaciones

Después de crear los servicios necesarios de Azure KeyVault y Azure Event Hubs, podrá crear su suscripción y empezar a recibir notificaciones de cambios a través de Microsoft Azure Event Hubs.

Creación de la subscripción

Las suscripciones para cambiar las notificaciones con centros de eventos son casi idénticas a las notificaciones de cambios con webhooks. La principal diferencia es que se basan en centros de eventos para entregar las notificaciones. Todas las demás operaciones son similares, incluida la creación de la suscripción.

La diferencia principal durante la creación de una suscripción será la notificationUrl. Se debe establecer en EventHub:https://<azurekeyvaultname>.vault.azure.net/secrets/<secretname>?tenantId=<domainname>, con los valores siguientes:

  • azurekeyvaultname -El nombre que proporcionó a la bóveda de claves cuando la creó. Puede encontrarse en el nombre DNS.
  • secretname -El nombre que proporcionó al secreto cuando lo creó. Se pueden encontrar en la página de Secretos de la Azure Key Vault.
  • domainname -El nombre de su espacio empresarial. por ejemplo, consto.onmicrosoft.com o contoso.com. Ya que este dominio se usará para tener acceso a la Azure Key Vault, es importante que coincida con el dominio usado por la suscripción de Azure que contiene la Azure Key Vault. Para obtener esta información, vaya a la página de información general del Azure Key Vault que creó y haga clic en la suscripción. El nombre de dominio se muestra debajo del campo Directorio.

Recibir notificaciones

Los eventos se enviarán a la aplicación por los centros de eventos. Para obtener más información, consulte recibir eventos en la documentación de Event hubs.

Antes de que pueda recibir las notificaciones en la aplicación, tendrá que crear otra directiva de acceso compartido con un permiso de "escucha" y obtener la cadena de conexión, de forma similar a los pasos que se indican en Configurar el centro de eventos de Azure.

Nota: Crear una directiva independiente para la aplicación que escucha mensajes de los centros de eventos en lugar de volver a usar las mismas cadenas de conexión que se establecen en Azure KeyVault. Esto asegura que todos los componentes de la solución solo tienen los permisos que necesita y siguen el principio de seguridad de permisos mínimos.

Nota: la aplicación recibe mensajes de validación cada vez que crea una nueva suscripción. Debería ignorar esas notificaciones. El ejemplo siguiente representa el cuerpo de un mensaje de validación.

 {
    "value":[
        {
            "subscriptionId":"NA",
            "subscriptionExpirationDateTime":"NA",
            "clientState":"NA",
            "changeType":"Validation: Testing client application reachability for subscription Request-Id: 522a8e7e-096a-494c-aaf1-ac0dcfca45b7",
            "resource":"NA",
            "resourceData":{
                "@odata.type":"NA",
                "@odata.id":"NA",
                "id":"NA"
            }
        }
    ]
}

¿Qué ocurre si falta la aplicación de Microsoft Graph Change Tracking?

Es posible que la entidad de servicio Seguimiento de cambios de Microsoft Graph no se encuentre en su espacio empresarial, dependiendo de cuándo se creó el espacio empresarial y de las operaciones administrativas. Para resolver este problema, ejecute la siguiente consulta en Microsoft Graph Explorer.

Detalles de la consulta: 0bf30f3b-4a52-48df-9a82-234910c4a086 es el appId global de la aplicación Microsoft Graph Change Tracking.

POST https://graph.microsoft.com/v1.0/servicePrincipals

{
    "appId": "0bf30f3b-4a52-48df-9a82-234910c4a086"
}

Nota: Puede obtener acceso denegado para ejecutar esta consulta. En este caso, seleccione el icono de engranaje situado al lado del nombre de su cuenta en la esquina superior izquierda. Después, seleccione Seleccionar permisos y busque Application.ReadWrite.All. Comprueba el permiso y selecciona Consentimiento. Después de contenerlo, vuelva a ejecutar la solicitud.

Nota: Esta API solo funciona con una cuenta profesional o educativa, en lugar de una cuenta personal. Asegúrese de que ha iniciado sesión con una cuenta de su dominio.

Como alternativa, puede usar el cmdlet New-MgServicePrincipal en Microsoft Graph PowerShell para agregar la entidad de servicio que falta. A continuación, se muestra un script de ejemplo.

Connect-Graph -Scopes "Application.ReadWrite.All"
New-MgServicePrincipal -AppId "0bf30f3b-4a52-48df-9a82-234910c4a086"

Pasos siguientes

Consulte los siguientes iniciadores rápidos de Azure Event Hubs: