处理来自不同AD租户中多个Azure订阅中存储帐户的Blob事件?

时间:2019-03-25 16:22:17

标签: azure azure-eventgrid

是否有可能收到有关存在于多个Azure订阅中的多个存储帐户中发生的blobCreated事件的通知?

我想处理在我的订阅中存在的中央Azure功能的任意存储帐户中发生的Blob创建的事件,但是我想给客户提供将数据存储在他们自己的订阅中的可能性。

我当时正在考虑使用事件网格Webhook端点将事件路由到我的中央Azure函数。这是实现多订阅方案的可靠方法吗?

编辑:更准确地说,我需要它来处理不同的租户(因为我们的客户将带来他们自己的订阅,并且我们需要集成它们而不将它们分配给我们的AD租户)

1 个答案:

答案 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端点发布在此范围之外。

enter image description here

其他更复杂的解决方案以及使用FAN-OUT Pub / Sub方式进行事件分发的与租户的完全隔离显示在以下屏幕片段中:

enter image description here

在上述解决方案中,扇入订户可以将原始事件消息调解为适当的面向业务的事件消息,其中包括用于访问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事件网格级联的示例:

enter image description here

通过以标准Pub / Sub方式向另一个事件网格模型的WebHook事件处理程序订阅自定义主题终结点,可以启用基于扇入到扇出模式的级联概念。

请注意,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"
        }
      }
    }
    

    请注意,topic属性必须具有“ sourceField”:null ,对于自定义主题(不适用于事件域),这是可以的。

  2. 对于webhook事件处理程序终结点,请在URL查询字符串中使用 aeg-sas-key ,例如:

    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;
    }
    

    请注意,每次发布时,原始事件消息(原始来源感兴趣)都会在事件数据对象中级联(嵌套)