Partilhar via


Receber notificações de alteração através dos Hubs de Eventos do Azure

Os webhooks não são adequados para receber notificações de alteração em cenários de débito elevado ou quando o recetor não consegue expor um URL de notificação publicamente disponível. Como alternativa, pode utilizar os Hubs de Eventos do Azure.

Exemplos de cenários de débito elevado em que pode utilizar os Hubs de Eventos do Azure incluem aplicações que subscrevem um grande conjunto de recursos, aplicações que subscrevem recursos que mudam frequentemente e aplicações multi-inquilino que subscrevem recursos num grande conjunto de organizações.

O artigo orienta-o ao longo do processo de gestão da sua subscrição do Microsoft Graph e como receber notificações de alteração através dos Hubs de Eventos do Azure.

Utilizar os Hubs de Eventos do Azure para receber uma notificação de alteração

Os Hubs de Eventos do Azure é um serviço popular de inclusão e distribuição de eventos em tempo real, compilado para ser dimensionável. Usar os Hubs de Eventos do Azure para receber notificações de alteração difere do webhooks em algumas maneiras, incluindo:

  • Você não depende de URLs com notificações publicamente expostas. O SDK dos Hubs de Eventos reencaminha as notificações para a sua aplicação.
  • Não é necessário responder à validação da URL de notificação. Você pode ignorar a mensagem de validação recebida.
  • Tem de aprovisionar um hub de eventos.
  • Tem de aprovisionar um Azure Key Vault ou adicionar o serviço Deteção de Alterações do Microsoft Graph à função remetente de dados no hub de eventos.

Configurar a autenticação dos Hubs de Eventos do Azure

A CLI do Azure permite-lhe criar scripts e automatizar tarefas administrativas no Azure. O CLI pode ser instalado em seu computador local ou ser executado diretamente a partir do 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: O script fornecido aqui é compatível com shells baseadas em Linux, Windows WSL e Azure Cloud Shell. Necessita de algumas atualizações para ser executada em shells do Windows.

Criar a subscrição e receber notificações

Depois de criar os serviços do Azure KeyVault e dos Hubs de Eventos do Azure necessários, pode agora criar a sua subscrição de notificação de alteração e começar a receber notificações de alteração através dos Hubs de Eventos do Azure.

Criar a subscrição

A criação de uma subscrição para receber notificações de alteração com os Hubs de Eventos é quase idêntica à criação da subscrição do webhook, mas com alterações importantes na propriedade notificationUrl . Primeiro, reveja os passos de criação da subscrição do webhook antes de continuar.

Na criação da subscrição, o notificationUrl tem de apontar para a localização dos Hubs de Eventos.

Se estiver a utilizar o Key Vault, a propriedade notificationUrl terá o seguinte aspeto: EventHub:https://<azurekeyvaultname>.vault.azure.net/secrets/<secretname>?tenantId=<domainname>, com os seguintes valores:

  • azurekeyvaultname - O nome que você atribuiu ao cofre de chaves quando o criou. Pode ser encontrado no nome DNS.
  • secretname - O nome que você atribuiu ao segredo quando o criou. Pode ser encontrado na página Segredos. do Azure Key Vault.
  • domainname - O nome do seu inquilino; por exemplo, contoso.com. Uma vez que este domínio é utilizado para aceder ao Azure Key Vault, é importante que corresponda ao domínio utilizado pela subscrição do Azure que detém o Azure Key Vault. Para obter essa informação, você pode ir para a página de visão geral do Azure Key Vault que você criou e clique na assinatura. O nome de domínio é exibido sob o campo Diretório.

Observação

Não são permitidas subscrições duplicadas. Quando um pedido de subscrição contém os mesmos valores para changeType e recurso que uma subscrição existente contém, o pedido falha com um código 409 Conflictde erro HTTP e a mensagem Subscription Id <> already exists for the requested combinationde erro .

Receber notificações

As notificações de alteração são agora entregues na sua aplicação pelos Hubs de Eventos. Para detalhes, confira Recebendo eventos na documentação Hubs de Eventos.

Antes de poder receber as notificações na sua aplicação, tem de criar outra política de acesso partilhado com uma permissão "Escutar" e obter a cadeia de ligação, semelhante aos passos listados em Configurar o hub de eventos.

Dica

Crie uma política separada para a aplicação que escuta mensagens dos Hubs de Eventos em vez de reutilizar a mesma cadeia de ligação que definiu no Azure KeyVault. Esta separação segue o princípio do menor privilégio ao garantir que cada componente da solução tem apenas as permissões de que precisa.

Processar notificações de validação

A sua aplicação recebe notificações de validação sempre que cria uma nova subscrição. Você deve ignorar essas notificações. O exemplo a seguir representa o corpo de uma mensagem de validação.

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

Subscrições para notificações avançadas com payloads grandes

O tamanho máximo da mensagem para os Hubs de Eventos é de 1 MB. Quando utiliza notificações avançadas, poderá esperar notificações que excedam este limite. Para receber notificações superiores a 1 MB através dos Hubs de Eventos, também tem de adicionar uma conta de armazenamento de blobs ao pedido de subscrição.

Configurar o armazenamento e criar uma subscrição

  1. Crie uma conta de armazenamento.
  2. Crie um contentor na conta de armazenamento. O nome do contentor tem de ser definido como microsoft-graph-change-notifications.
  3. Obtenha as chaves de acesso da conta de armazenamento ou a cadeia de ligação.
  4. Adicione a cadeia de ligação ao cofre de chaves e atribua-lhe um nome. Este valor é o nome do segredo.
  5. Crie ou recrie a sua subscrição, incluindo agora a propriedade blobStoreUrl na seguinte sintaxe: blobStoreUrl: "https://<azurekeyvaultname>.vault.azure.net/secrets/<secretname>?tenantId=<domainname>"

Receber notificações avançadas

Quando os Hubs de Eventos recebem um payload de notificação superior a 1 MB, a notificação não contém as propriedades resource, resourceData e encryptedContent incluídas em notificações avançadas. Em vez disso, a notificação contém uma propriedade AdditionalPayloadStorageId com um ID que aponta para o blob na sua conta de armazenamento onde estas propriedades estão armazenadas.

E se a aplicação Controlo de Alterações do Microsoft Graph estiver em falta?

O principal de serviço de Controlo de Alterações do Microsoft Graph pode estar em falta no seu inquilino, dependendo de quando o inquilino foi criado e das operações administrativas. O appId exclusivo global do principal de serviço é 0bf30f3b-4a52-48df-9a82-234910c4a086 e pode executar a seguinte consulta para confirmar se existe no inquilino.

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

Se o principal de serviço não existir, crie-o da seguinte forma. Tem de conceder à aplicação de chamada a permissão Application.ReadWrite.All para executar esta operação.

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