Можно ли настроить события, которые BLOB-объектов в учетной записи хранения запускается при создании BLOB-объектов? - PullRequest
5 голосов

Можно ли изменить событие по умолчанию, которое запускается на blobcreated?

Учетные записи хранилищ могут запускать события при удалении / создании больших объектов:

enter image description here

Если вы добавите новую подписку на событие, вы можете выбрать один из трех вариантов:

enter image description here

Я бы хотел использовать пользовательскую схему ввода . Тем не менее, нет документации о том, как его использовать.

Как настроить схему пользовательского ввода?

Схема по умолчанию выглядит примерно так:

{
    "topic": "/subscriptions/xxxxxxxxxxx/resourceGroups/myresourcegroup/providers/Microsoft.Storage/storageAccounts/mystoraccount",
    "subject": "/blobServices/default/containers/xmlinput/blobs/myj.json",
    "eventType": "Microsoft.Storage.BlobCreated",
    "eventTime": "2019-05-20T18:58:28.7390111Z",
    "id": "xxxxxxxxxxxxxxxx",
    "data": {
        "api": "PutBlockList",
        "clientRequestId": "xxxxxxxxxxxxxxxx",
        "requestId": "xxxxxxxxxxxxxxxx",
        "eTag": "0x8D6DD55254EBE75",
        "contentType": "application/json",  
        "contentLength": 874636,
        "blobType": "BlockBlob",
        "url": "https://mystoraccount.blob.core.windows.net/xmlinput/myj.json",
        "sequencer": "00000000000000000000000000005FAC0000000000614963",
        "storageDiagnostics": {
            "batchId": "xxxxxxxxxxxxxxxx"
        }
    },
    "dataVersion": "",
    "metadataVersion": "1"
}

Я хотел бы ТОЛЬКО вернуть имя файла, в данном случае это подстрока subject, myj.json .

Как настроить событие, которое будет запущено?

Желаемый результат:

{
  "filename": "myj.json"
}

1 Ответ

7 голосов
/ 24 мая 2019

Сетка событий Azure поддерживает CustomInputSchema только для пользовательских тем и доменов событий. Другими словами, встроенные источники событий AEG могут распространяться только с EventGridSchema (схема по умолчанию) или CloudEventV01Schema.

Для вашего решения, когда вашему потребителю требуется подписаться на события AEG с помощью пользовательской схемы, необходимо связать события с пользовательской темой с помощью CustomInputSchema . Следующий фрагмент экрана показывает эту концепцию:

enter image description here

Для создания цепочки тем (интегратор) может использоваться безсерверная функция Azure или Api Management. В моем тесте (как показано на рисунке выше) была использована функция EventGridTrigger.

Интегратор несет ответственность за запуск конечной точки пользовательской темы AEG с помощью пользовательской схемы.

В следующем фрагменте кода показан пример интегратора EventGridTrigger:

#r "Newtonsoft.Json"

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

static HttpClient client = new HttpClient() { BaseAddress = new Uri (Environment.GetEnvironmentVariable("CustomTopicEndpointEventGrid")) };

public static async Task Run(JObject eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.ToString());

    string url = $"{eventGridEvent["data"]?["url"]?.Value<string>()}";
    if(!string.IsNullOrEmpty(url))
    {
        // Fire event
        var response = await client.PostAsJsonAsync("", new[] { new { filename = url.Substring(url.LastIndexOf('/') + 1) } });
        log.LogInformation(response.ToString());
    }

    await Task.CompletedTask;
}

Обратите внимание, что CustomInputSchema все еще находится в предварительном просмотре, поэтому для создания пользовательской темы с пользовательской схемой ввода следуйте документации здесь . Также можно использовать REST API, подробнее см. здесь .

Ниже приведен пример полезной нагрузки для создания настраиваемой темы с помощью CustomInputSchema с использованием API REST:

    {
      "location": "westus",
      "tags": {
        "tag1": "abcd",
        "tag2": "ABCD"
      },
      "properties": {
        "inputSchema": "CustomEventSchema",
        "inputSchemaMapping": {
          "properties": {
            "id": {
              "sourceField": null
              },
            "topic": {
              "sourceField": null
              },
            "eventTime": {
              "sourceField": null
              },
            "eventType": {
              "sourceField": "myEventType",
              "defaultValue": "BlobCreated"
              },
            "subject": {
              "sourceField": "mySubject",
              "defaultValue": "/containers/xmlinput/blobs"
              },
            "dataVersion": {
              "sourceField": null,
              "defaultValue": "1.0"
              }
            },
         "inputSchemaMappingType": "Json"
        }
     }
  }

Если у вас есть пользовательская тема с CustomInputSchema , за схемой доставки вывода будет следовать схема из ввода. В случае, когда ваша подписка на эту пользовательскую тему будет доставлена ​​с EventGridSchema, то для доставки события будет применено вышеуказанное сопоставление

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