是否可以更改在blobcreated
上触发的默认事件?
存储帐户具有在删除/创建Blob时触发事件的功能:
如果添加新的事件订阅,则可以在以下三个选项之间进行选择:
我希望能够使用自定义输入模式。但是,没有有关如何使用它的文档。
我们如何自定义自定义输入模式?
默认架构如下所示:
{
"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"
}
答案 0 :(得分:6)
Azure事件网格仅对自定义和事件域主题支持 CustomInputSchema 。换句话说,AEG内置事件源只能与EventGridSchema(默认架构)或CloudEventV01Schema一起分发。
对于您的解决方案,当使用者需要使用自定义架构订阅AEG事件时,您需要使用 CustomInputSchema 将事件链接到自定义主题。以下屏幕片段显示了此概念:
对于主题链接(集成商),可以使用无服务器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交付有关此自定义主题的订阅时,上述映射将应用于事件交付。