Получение уведомлений об изменениях через Центры событий Azure

Веб-перехватчики могут не подходить для получения уведомлений об изменениях в сценариях с высокой пропускной способностью или когда получатель не может предоставить общедоступный URL-адрес уведомления. В качестве альтернативы можно использовать Центры событий Azure.

Хорошими примерами сценариев с высокой пропускной способностью являются приложения, подписывающиеся на большой набор ресурсов, приложения, подписывающиеся на ресурсы, которые изменяются с высокой частотой, и мультитенантные приложения, которые подписываются на ресурсы в большом наборе организаций.

В этой статье описывается процесс управления подпиской Microsoft Graph и получение уведомлений об изменениях через Центры событий Azure.

Получение уведомлений об изменениях с помощью концентраторов событий Azure

Концентраторы событий Azure — это сервис приема и распространения популярных событий в режиме реального времени, созданный для масштабирования. Для получения уведомлений об изменениях вместо традиционных веб-перехватчиков можно использовать концентраторы событий Azure.
Использование концентраторов событий Azure для получения уведомлений о изменениях отличается от веб-перехватчиков несколькими моментами, в том числе:

  • Не приходится полагаться на общедоступные URL-адреса уведомлений. Пакет SDK концентраторов событий ретранслирует уведомления в ваше приложение.
  • Нет необходимости отвечать на проверку URL-адреса уведомлений. Можно пропустить полученное сообщение о проверке.
  • Необходимо подготовить концентратор событий Azure.
  • Необходимо подготовить хранилище Azure Key Vault.

Настройка хранилища Azure Key Vault и концентраторов событий Azure

В этом разделе вы узнаете, как выполнить настройку обязательных служб Azure.

Средство Azure CLI позволяет создавать сценарии и автоматизировать админстративные задачи в Azure. Средство CLI можно установить на локальный компьютер или запустить напрямую в 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}"

Примечание. Представленный здесь сценарий совместим с оболочками на основе Linux, Windows WSL и Azure Cloud Shell. При этом для запуска в оболочках Windows необходимо сделать несколько обновлений.

Создание подписки и просмотр уведомлений

После создания обязательных служб хранилища Azure Key Vault и концентраторов событий Azure вы сможете создать свою подписку и начать получать уведомления об изменениях через концентраторы событий Azure.

Создание подписки

Подписки на изменение уведомлений с помощью концентраторов событий почти идентичны уведомлениям об изменениях с помощью веб-перехватчиков. Основное отличие заключается в том, что для доставки уведомлений используют концентраторы событий. Другие операции сходны, в том числе создание подписки.

Основное отличие в ходе создания подписки будет заключаться в значении notificationUrl,. Необходимо настроить его на EventHub:https://<azurekeyvaultname>.vault.azure.net/secrets/<secretname>?tenantId=<domainname> со следующими значениями:

  • azurekeyvaultname — название созданного хранилища ключей. Его можно найти в DNS-имени.
  • secretname — название созданного секрета. Его можно найти на странице Секреты в хранилище Azure Key Vault.
  • domainname — имя клиента, например, consto.onmicrosoft.com или contoso.com. Поскольку этот домен будет использоваться для доступа к хранилищу Azure Key Vault, важно, чтобы он соответствовал домену, используемому подпиской Azure с хранилищем Azure Key Vault. Чтобы получить эту информацию, вы можете перейти на страницу обзора созданного хранилища Azure Key Vault и щелкнуть на подписку. Имя домена выводится в поле Каталог.

Получение уведомлений

События будут доставлены концентраторами событий в ваше приложение. Дополнительные сведения см. в статье Получение событий в документации по концентраторам событий.

Чтобы вы могли получать уведомления в приложении, потребуется создать еще одну политику общего доступа с разрешением на "Прослушивание" и получить строку подключения, как в инструкциях из раздела Настройка концентратора событий Azure.

Примечание. Создайте отдельную политику для приложения, которое прослушивает сообщения в концентраторах событий, вместо того чтобы повторно использовать строку подключения, заданную в хранилище Azure KeyVault. Это гарантирует, что каждый компонент решения будет иметь только нужные разрешения в соответствии с принципом минимальных разрешений.

Примечание. Ваше приложение будет получать сообщения о проверке каждый раз при создании новой подписки. Эти уведомления следует пропустить. В приведенном ниже примере представлен текст сообщения о проверке.

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

Что произойдет, если приложение для отслеживания изменений в Microsoft Graph отсутствует?

Возможно, в вашем клиенте нет субъекта-службы отслеживания изменений в Microsoft Graph. Это зависит от того, когда был создан клиент и от административных операций. Чтобы устранить эту проблему, выполните следующий запрос в проводнике Microsoft Graph.

Сведения о запросе: 0bf30f3b-4a52-48df-9a82-234910c4a086 — глобальный идентификатор приложения для отслеживания изменений в Microsoft Graph.

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

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

Примечание. Вы можете получить отказ в выполнении этого запроса. В этом случае щелкните значок шестеренки рядом с именем своей учетной записи в левом верхнем углу. Затем выберите Выбрать разрешения, а затем выполните поиск по запросу Application.ReadWrite.All. Проверьте разрешения и выберите Согласие. После того как вы подтвердите новое разрешение, снова выполните поисковый запрос.

Примечание. Этот API-интерфейс действует только для учебной или рабочей учетной записи, но не в личной учетной записи. Убедитесь, что вы вошли в систему через учетную запись в своем домене.

Кроме того, для добавления отсутствующего субъекта-службы можно использовать командлет PowerShell New-MgServicePrincipal в Microsoft Graph. Ниже приведен пример сценария.

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

Дальнейшие действия

См. следующие краткие руководства о концентраторах событий Azure: