Обрабатывать события BLOB-объектов из учетных записей хранения в нескольких подписках Azure в разных клиентах AD? - PullRequest
0 голосов
/ 25 марта 2019

Можно ли получать уведомления о событиях blobCreated, происходящих в нескольких учетных записях хранения, которые живут в нескольких подписках Azure?

Я хотел бы обрабатывать события, созданные в BLOB-объектах, происходящие в произвольных учетных записях хранения в центральной функции Azure, которая живетв моей подписке, но я хотел бы предоставить клиентам возможность хранить данные в своей собственной подписке.

Я думал об использовании конечных точек WebHook сетки событий для маршрутизации событий в мою центральную функцию Azure.Будет ли это надежным подходом для включения сценариев с несколькими подписками?

Редактировать: Точнее, мне нужно работать с разными арендаторами (так как наши клиенты приносят свои подписки, и нам нужно интегрировать их безприсвоение их нашему арендатору AD)

1 Ответ

1 голос
/ 28 марта 2019

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

Подписка на источник распределенного интереса по подпискам 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 может быть размещена за пределами этой области.

enter image description here

Другое более сложное решение и полная изоляция от арендаторов с помощьюРаспределение событий с использованием метода FAN-OUT Pub / Sub показано в следующем фрагменте экрана:

enter image description here

В приведенном выше решении подписчик подписчикаможет передавать исходное сообщение о событии в правильно ориентированное на бизнес сообщение о событии, включая короткий 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:

enter image description here

Каскадная концепция, основанная на шаблоне Fan-In to Fan-Out, включается подпиской конечной точки пользовательского раздела на обработчик событий WebHookдругой модели сетки событий в стандартном режиме Pub / Sub.

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

  1. Создайте конечную точку пользовательского раздела с 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 , что нормально для пользовательской темы (не для доменов событий).

  2. Для конечной точки обработчика событий webhook используйте aeg-sas-key в строке запроса url, например:

    https://myTopic.westus -1.eventgrid.azure.net / api/ events? aeg-sas-key = xxxxxxxxxx

    Обратите внимание, что значение aeg-sas-key должно быть строкой в ​​кодировке URL.

  3. Для проверки подписки используется 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;
    }
    

    Обратите внимание, что исходное сообщение о событии (интерес исходного источника) каскадно (вложено) в объект данных события каждый раз, когда публикуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...