天蓝色事件网格中的订阅验证事件消息模式是什么?
What is the subscription validation event message schema in azure event grid?
- 使用门户创建了具有云事件架构的新 azure 事件网格域。
- 使用可以接收订阅验证事件和事件通知的 azure 函数创建了新的网络挂钩端点。
- 使用门户为上述域(作为后续订阅的一部分)创建了新的 azure 事件网格主题。
- 使用上述 Web 挂钩端点使用云事件架构创建了新的 azure 事件网格订阅。
- 创建订阅后,网格基础结构调用端点并使用订阅验证事件来验证 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'.
事件网格模型的内部 事件,例如 eventTypes SubscriptionValidation 和 SubscriptionDeletion。这些事件类型的架构始终与默认架构相同,例如 EventGridSchema。换句话说,它不依赖于 EventDeliverySchema。 IMO,具有内部事件的默认模式正在创建强大的事件类型,特别是当我们有 CustomInputSchema 时。
Interest source 事件(主题)是由输入架构定义的事件,目前事件网格模型支持 3 种类型,例如 EventGridSchema(默认)、CloudEventSchema 和 CustomInputSchema。
AEG 支持以下架构 input/output 映射:
- EventGridSchema 传递模式 EventGridSchema 和 CloudEventSchema
- CloudEventSchema 仅传递架构 CloudSchemaSchema
- CustomInputSchema 传递架构 EventGridSchema 和 CloudEventSchema 和 CustomInputSchema
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
- 使用门户创建了具有云事件架构的新 azure 事件网格域。
- 使用可以接收订阅验证事件和事件通知的 azure 函数创建了新的网络挂钩端点。
- 使用门户为上述域(作为后续订阅的一部分)创建了新的 azure 事件网格主题。
- 使用上述 Web 挂钩端点使用云事件架构创建了新的 azure 事件网格订阅。
- 创建订阅后,网格基础结构调用端点并使用订阅验证事件来验证 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'.
事件网格模型的内部 事件,例如 eventTypes SubscriptionValidation 和 SubscriptionDeletion。这些事件类型的架构始终与默认架构相同,例如 EventGridSchema。换句话说,它不依赖于 EventDeliverySchema。 IMO,具有内部事件的默认模式正在创建强大的事件类型,特别是当我们有 CustomInputSchema 时。
Interest source 事件(主题)是由输入架构定义的事件,目前事件网格模型支持 3 种类型,例如 EventGridSchema(默认)、CloudEventSchema 和 CustomInputSchema。 AEG 支持以下架构 input/output 映射:
- EventGridSchema 传递模式 EventGridSchema 和 CloudEventSchema
- CloudEventSchema 仅传递架构 CloudSchemaSchema
- CustomInputSchema 传递架构 EventGridSchema 和 CloudEventSchema 和 CustomInputSchema
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