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

Los webhooks no son adecuados para recibir notificaciones de cambio en escenarios de alto rendimiento o cuando el receptor no puede 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 en los que puede usar Azure Event Hubs incluyen aplicaciones que se suscriben a un gran conjunto de recursos, aplicaciones que se suscriben a recursos que cambian con frecuencia y 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.

Uso de Azure Event Hubs para recibir notificaciones de cambio

Azure Event Hubs es un conocido servicio de distribución y recopilación de eventos en tiempo real creado para escalar. 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 retransmite 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.
  • Debe aprovisionar un centro de eventos.
  • Debe aprovisionar una Key Vault de Azure o agregar el servicio de Change Tracking de Microsoft Graph al rol Remitente de datos en el centro de eventos.

Configuración de la autenticación de Azure Event Hubs

La CLI de Azure permite crear 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 los shells basados en Linux, Windows WSL y Azure Cloud Shell. Requiere que algunas actualizaciones se ejecuten en shells de Windows.

Create la suscripción y recibir notificaciones

Después de crear los servicios de Azure KeyVault y Azure Event Hubs necesarios, ahora puede crear la suscripción de notificación de cambios y empezar a recibir notificaciones de cambio a través de Azure Event Hubs.

Create la suscripción

La creación de una suscripción para recibir notificaciones de cambios con Event Hubs es casi idéntica a la creación de la suscripción de webhook, pero con cambios importantes en la propiedad notificationUrl . Revise primero los pasos de creación de suscripciones de webhook antes de continuar.

En la creación de la suscripción, notificationUrl debe apuntar a la ubicación de Event Hubs.

Si usa Key Vault, la propiedad notificationUrl tiene el siguiente aspecto: EventHub:https://<azurekeyvaultname>.vault.azure.net/secrets/<secretname>?tenantId=<domainname>, con los siguientes valores:

  • 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 del inquilino; por ejemplo, contoso.com. Dado que este dominio se usa para acceder a azure Key Vault, es importante que coincida con el dominio que usa la suscripción de Azure que contiene la Key Vault de Azure. 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.

Nota:

No se permiten suscripciones duplicadas. Cuando una solicitud de suscripción contiene los mismos valores para changeType y el recurso que contiene una suscripción existente, se produce un error en la solicitud con un código 409 Conflictde error HTTP y el mensaje Subscription Id <> already exists for the requested combinationde error .

Recibir notificaciones

Event Hubs entrega ahora las notificaciones de cambio a la aplicación. Para obtener más información, consulte recibir eventos en la documentación de Event hubs.

Para poder recibir las notificaciones en la aplicación, debe crear otra directiva de acceso compartido con un permiso "Escuchar" y obtener el cadena de conexión, de forma similar a los pasos enumerados en Configuración del centro de eventos.

Sugerencia

Create una directiva independiente para la aplicación que escucha mensajes de Event Hubs en lugar de reutilizar el mismo cadena de conexión que ha establecido en Azure KeyVault. Esta separación sigue el principio de privilegios mínimos al asegurarse de que cada componente de la solución solo tiene los permisos que necesita.

Control de notificaciones de validación

La aplicación recibe notificaciones 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"
            }
        }
    ]
}

Suscripciones para notificaciones enriquecidas con cargas grandes

El tamaño máximo del mensaje para Event Hubs es de 1 MB. Cuando se usan notificaciones enriquecidas, es posible que se esperen notificaciones que superen este límite. Para recibir notificaciones de más de 1 MB a través de Event Hubs, también debe agregar una cuenta de almacenamiento de blobs a la solicitud de suscripción.

Configuración del almacenamiento y creación de una suscripción

  1. Create una cuenta de almacenamiento.
  2. Create un contenedor en la cuenta de almacenamiento y asígnele un nombre.
  3. Recupere las claves de acceso de la cuenta de almacenamiento o cadena de conexión.
  4. Agregue el cadena de conexión al almacén de claves y asígnele un nombre. Este valor es el nombre del secreto.
  5. Create o vuelva a crear la suscripción, incluida ahora la propiedad blobStoreUrl en la sintaxis siguiente:blobStoreUrl: "https://<azurekeyvaultname>.vault.azure.net/secrets/<secretname>?tenantId=<domainname>"

Recepción de notificaciones enriquecidas

Cuando Event Hubs recibe una carga de notificación de más de 1 MB, la notificación no contiene las propiedades resource, resourceData y encryptedContent que se incluyen en notificaciones enriquecidas. En su lugar, la notificación contiene una propiedad additionalPayloadStorageId con un identificador que apunta al blob de la cuenta de almacenamiento donde se almacenan estas propiedades.

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

Es posible que falte la entidad de servicio de Microsoft Graph Change Tracking del inquilino, en función de cuándo se haya creado el inquilino y de las operaciones administrativas. El appId único global de la entidad de servicio es 0bf30f3b-4a52-48df-9a82-234910c4a086 y puede ejecutar la siguiente consulta para confirmar si existe en el inquilino.

GET https://graph.microsoft.com/v1.0/servicePrincipals(appId='0bf30f3b-4a52-48df-9a82-234910c4a086')

Si la entidad de servicio no existe, créela como se indica a continuación. Debe conceder a la aplicación que realiza la llamada el permiso Application.ReadWrite.All para ejecutar esta operación.

Método 1

POST https://graph.microsoft.com/v1.0/servicePrincipals
Content-type: application/json

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

Método 2

POST https://graph.microsoft.com/v1.0/servicePrincipals(appId='0bf30f3b-4a52-48df-9a82-234910c4a086')
Content-type: application/json
Prefer: create-if-missing

{
    "displayName": "Microsoft Graph Change Tracking"
}