Исходя из нашего обсуждения, в следующих фрагментах экрана показаны ваши сценарии с несколькими арендаторами.
Подписка на источник распределенного интереса по подпискам Azure (мультитенантам) завершена, сопоставляя темук конечной точке webhook.Обратите внимание, что тема представляет полный путь к ресурсу (id) места, в котором событие публикует (публикует) службу AEG.Этот путь находится в области действия текущего клиента, см. Следующий пример:
"topic": "/subscriptions/myID/resourceGroups/myRG/providers/microsoft.storage/storageaccounts/mySA"
"endpointBaseUrl": "https://myFnc.azurewebsites.net/runtime/webhooks/EventGrid?functionName=myEventGridTrigger&code=xxxx"
Это сопоставление объявлено в метаданных подписки, хранящихся в той же области, что и тема.С другой стороны, конечная точка webhook может быть размещена за пределами этой области.
Другое более сложное решение и полная изоляция от арендаторов с помощьюРаспределение событий с использованием метода FAN-OUT Pub / Sub показано в следующем фрагменте экрана:
В приведенном выше решении подписчик подписчикаможет передавать исходное сообщение о событии в правильно ориентированное на бизнес сообщение о событии, включая короткий sasToken для доступа к метаданным и / или телу большого двоичного объекта и т. д.
Чтобы создать подписку на событие в своем клиенте с помощью обработчика событий для вашего EventGridTriggerфункцию, вы можете использовать, например, вызов API REST , см. следующий пример:
PUT https://management.azure.com/subscriptions/myId/resourceGroups/myRG/providers/Microsoft.Storage/storageaccounts/mySA/providers/Microsoft.EventGrid/eventSubscriptions/mySubscription?api-version=2019-01-01
Заголовки:
Authorization:Bearer eyJ0eXAiOiJKV1QiLCJhb....
Тело (минимальная полезная нагрузка):
{
"properties": {
"destination": {
"endpointType": "WebHook",
"properties": {
"endpointUrl": "https://myFnc.azurewebsites.net/runtime/webhooks/EventGrid?functionName=myEventGridTrigger&code=xxxxxxxx..."
}
}
}
}
ОБНОВЛЕНИЕ:
Еще один способ использования модели публикаций / вложений таблицы событий Azure в изолированной архитектуре распределенных событий с несколькими арендаторами - это каскадирование .Конвейер логических событий можно создать с помощью каскадирования таблиц событий Azure, например, подписав сетку событий Azure на другую с помощью настраиваемой темы.
В следующем фрагменте экрана показан пример каскадирования сетки событий Azure:
Каскадная концепция, основанная на шаблоне Fan-In to Fan-Out, включается подпиской конечной точки пользовательского раздела на обработчик событий WebHookдругой модели сетки событий в стандартном режиме Pub / Sub.
Обратите внимание, что в сетке событий Azure нет встроенной конечной точки для каскадирования друг друга, включая петлю события проверки.Однако следующие шаги могут разрешить каскадную сетку событий Azure друг другу.
Создайте конечную точку пользовательского раздела с CustomInputSchema , например:
{
"properties": {
"inputSchema": "CustomEventSchema",
"inputSchemaMapping": {
"properties": {
"id": {
"sourceField": null
},
"topic": {
"sourceField": null
},
"eventTime": {
"sourceField": null
},
"eventType": {
"sourceField": "myEventType",
"defaultValue": "recordInserted"
},
"subject": {
"sourceField": "subject",
"defaultValue": "/myapp/vehicles/motorcycles"
},
"dataVersion": {
"sourceField": null,
"defaultValue": "1.0"
}
},
"inputSchemaMappingType": "Json"
}
}
}
Обратите внимание, что свойство темы должно иметь "sourceField": null , что нормально для пользовательской темы (не для доменов событий).
Для конечной точки обработчика событий webhook используйте aeg-sas-key в строке запроса url, например:
https://myTopic.westus -1.eventgrid.azure.net / api/ events? aeg-sas-key = xxxxxxxxxx
Обратите внимание, что значение aeg-sas-key должно быть строкой в кодировке URL.
Для проверки подписки используется validationUrl рукопожатие в режиме пожара и забывания.Это может быть реализовано в функции EventGridTrigger и подписке на пользовательскую тему для каскадных целей.В следующем фрагменте кода показан пример этой реализации:
#r "Newtonsoft.Json"
using System;
using System.Threading.Tasks;
using System.Text;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public static async Task Run(JObject eventGridEvent, ILogger log)
{
log.LogInformation(eventGridEvent.ToString());
string eventType = $"{eventGridEvent["data"]?["eventType"]?.Value<string>()}";
if(!string.IsNullOrEmpty(eventType) && eventType == "Microsoft.EventGrid.SubscriptionValidationEvent")
{
// manual validation
string validationUrl = $"{eventGridEvent["data"]?["data"]?["validationUrl"]?.Value<string>()}";
using (var client = new HttpClient())
{
var response = await client.GetAsync(validationUrl);
log.LogInformation(response.ToString());
}
}
else
{
// notifications
}
await Task.CompletedTask;
}
Обратите внимание, что исходное сообщение о событии (интерес исходного источника) каскадно (вложено) в объект данных события каждый раз, когда публикуется