是否可以自定义存储帐户中的Blob在创建Blob时触发的事件?

时间:2019-05-21 14:53:40

标签: azure azure-storage azure-storage-blobs azure-eventgrid

是否可以更改在blobcreated上触发的默认事件?

存储帐户具有在删除/创建Blob时触发事件的功能:

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 个答案:

答案 0 :(得分:6)

Azure事件网格仅对自定义和事件域主题支持 CustomInputSchema 。换句话说,AEG内置事件源只能与EventGridSchema(默认架构)或CloudEventV01Schema一起分发。

对于您的解决方案,当使用者需要使用自定义架构订阅AEG事件时,您需要使用 CustomInputSchema 将事件链接到自定义主题。以下屏幕片段显示了此概念:

enter image description here

对于主题链接(集成商),可以使用无服务器Azure功能或Api管理。在我的测试中(如上图所示),使用了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仍在预览中,因此要使用自定义输入架构创建自定义主题,请遵循文档here。另外,可以使用REST API,请参阅更多详细信息here

以下是我的有效负载示例,该负载用于使用REST Api使用CustomInputSchema创建自定义主题:

    {
      "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交付有关此自定义主题的订阅时,上述映射将应用于事件交付。