天蓝色事件网格中的订阅验证事件消息模式是什么?

What is the subscription validation event message schema in azure event grid?

  1. 使用门户创建了具有云事件架构的新 azure 事件网格域。
  2. 使用可以接收订阅验证事件和事件通知的 azure 函数创建了新的网络挂钩端点。
  3. 使用门户为上述域(作为后续订阅的一部分)创建了新的 azure 事件网格主题。
  4. 使用上述 Web 挂钩端点使用云事件架构创建了新的 azure 事件网格订阅。
  5. 创建订阅后,网格基础结构调用端点并使用订阅验证事件来验证 Web 挂钩端点。

令我惊讶的是,验证事件结构(如下所示)似乎符合本机事件网格架构而不是云事件架构:

[{
    "id": "6309ef83-117f-47aa-a07c-50f6e71a8ca5",
    "topic": "/subscriptions/13ad1203-e6d5-4076-bf2b-73465865f9f0/resourceGroups/xxxx-sandbox-rg/providers/Microsoft.EventGrid/domains/eg-xxx-test-cloud-domain/topics/eg-xxx-test-cloud-topic",
    "subject": "",
    "data": {
        "validationCode": "391889BB-FCC3-4269-A2BD-0918B5BAB0AE",
        "validationUrl": "https://rp-westus.eventgrid.azure.net/eventsubscriptions/xxxx-subscription-3/validate?id=391889BB-FCC3-4269-A2BD-0918B5BAB0AE&t=2019-01-30T15:45:37.0521594Z&apiVersion=2018-09-15-preview&[Hidden Credential]"
    },
    "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime": "2019-01-30T15:45:37.0521594Z",
    "metadataVersion": "1",
    "dataVersion": "2"
}]

我希望遵循符合云事件模式的订阅验证事件(基于 https://docs.microsoft.com/en-us/azure/event-grid/cloudevents-schema#cloudevent-schema 处的 0.1 版云事件模式):

{
    "eventID" : "6309ef83-117f-47aa-a07c-50f6e71a8ca5",
    "source" : "/subscriptions/13ad1203-e6d5-4076-bf2b-73465865f9f0/resourceGroups/xxxx-sandbox-rg/providers/Microsoft.EventGrid/domains/eg-xxx-test-cloud-domain/topics/eg-xxx-test-cloud-topic",
    "data": {
        "validationCode": "391889BB-FCC3-4269-A2BD-0918B5BAB0AE",
        "validationUrl": "https://rp-westus.eventgrid.azure.net/eventsubscriptions/xxxx-subscription-3/validate?id=391889BB-FCC3-4269-A2BD-0918B5BAB0AE&t=2019-01-30T15:45:37.0521594Z&apiVersion=2018-09-15-preview&[Hidden Credential]"
    },
    "eventType" : "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime" : "2019-01-30T15:45:37.0521594Z",
    "cloudEventsVersion" : "0.1",
    "eventTypeVersion" : "2",
}

我错过了什么?

这是云事件 V0.1 规范的 Azure 事件网格实现中的已知问题/预期行为。在 Azure 事件网格中实施 Cloud Events v0.1 规范时,Cloud Events 标准中没有定义验证握手/滥用保护模型,因此 Event Grid 现有的验证握手 model/schema 用于 Cloud Event 订阅者,因为嗯。

基本上,webhook 订阅者正在处理以下两组事件。具体事件类型存储在httpheader'aeg-event-type'.

  1. 事件网格模型的内部 事件,例如 eventTypes SubscriptionValidationSubscriptionDeletion。这些事件类型的架构始终与默认架构相同,例如 EventGridSchema。换句话说,它不依赖于 EventDeliverySchema。 IMO,具有内部事件的默认模式正在创建强大的事件类型,特别是当我们有 CustomInputSchema 时。

  2. Interest source 事件(主题)是由输入架构定义的事件,目前事件网格模型支持 3 种类型,例如 EventGridSchema(默认)、CloudEventSchemaCustomInputSchema。 AEG 支持以下架构 input/output 映射:

    1. EventGridSchema 传递模式 EventGridSchemaCloudEventSchema
    2. CloudEventSchema 仅传递架构 CloudSchemaSchema
    3. CustomInputSchema 传递架构 EventGridSchemaCloudEventSchemaCustomInputSchema

    header 中的事件类型是:aeg-event-type=Notification 并且架构基于订阅的 EventDeliverySchema(请参阅以下映射)。

基于上述内容,对于您的方案,您应该为内部事件(默认架构为 EventGridSchema)和基于订阅的 EventDeliverySchema 的通知事件设置单独的强类型 objects。

以下是 http headers 的示例:

aeg-subscription-name=EVENTGRIDSCHEMA
aeg-delivery-count=0
aeg-data-version=
aeg-metadata-version=0
aeg-event-type=SubscriptionValidation

注意,只有订阅名称才能确定订阅了哪个EventDeliverySchema。最好有一个额外的 aeg header 例如:aeg-subscription-labels 将一些订阅元数据传递给订阅者处理程序。

作为解决方法,我们可以通过 url 查询参数将一些值传递给订阅者 webhook 处理程序,例如:&eds=CustomInputSchema