是否有可能收到有关存在于多个Azure订阅中的多个存储帐户中发生的blobCreated事件的通知?
我想处理在我的订阅中存在的中央Azure功能的任意存储帐户中发生的Blob创建的事件,但是我想给客户提供将数据存储在他们自己的订阅中的可能性。
我当时正在考虑使用事件网格Webhook端点将事件路由到我的中央Azure函数。这是实现多订阅方案的可靠方法吗?
编辑:更准确地说,我需要它来处理不同的租户(因为我们的客户将带来他们自己的订阅,并且我们需要集成它们而不将它们分配给我们的AD租户)
答案 0 :(得分:1)
根据我们的讨论,以下屏幕片段显示了您的多租户场景中的粉丝。
在天青订阅(多租户)中订阅分布式兴趣源已完成,将主题映射到webhook端点。请注意,该主题表示事件正发布(发布)到AEG服务的地方的完整资源路径(id)。此路径在当前租户的范围内,请参见以下示例:
"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方式进行事件分发的与租户的完全隔离显示在以下屏幕片段中:
在上述解决方案中,扇入订户可以将原始事件消息调解为适当的面向业务的事件消息,其中包括用于访问blob元数据和/或正文等的简短sasToken。
要在租户中使用EventGridTrigger函数的事件处理程序创建事件订阅,您可以使用REST API call,例如,请参见以下示例:
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事件网格级联的示例:
通过以标准Pub / Sub方式向另一个事件网格模型的WebHook事件处理程序订阅自定义主题终结点,可以启用基于扇入到扇出模式的级联概念。
请注意,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"
}
}
}
请注意,topic属性必须具有“ sourceField”:null ,对于自定义主题(不适用于事件域),这是可以的。
对于webhook事件处理程序终结点,请在URL查询字符串中使用 aeg-sas-key ,例如:
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;
}
请注意,每次发布时,原始事件消息(原始来源感兴趣)都会在事件数据对象中级联(嵌套)