Получение уведомлений об изменениях через Центры событий 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: