将自定义字段映射到事件网格架构

即使事件数据与预期的事件网格架构不匹配,也仍然可以使用事件网格将事件路由到订阅服务器。 本文介绍如何将你的架构映射到事件网格架构。

原始事件架构

假设你有一个以下述格式发送事件的应用程序:

[
  {
    "myEventTypeField":"Created",
    "resource":"Users/example/Messages/1000",
    "resourceData":{"someDataField1":"SomeDataFieldValue"}
  }
]

虽然该格式与所需的架构不符,但你仍可使用事件网格将字段映射到架构。 也可以原始架构接收值。

使用映射的字段创建自定义主题

在创建自定义主题时,请指定如何将字段从原始事件映射到事件网格架构。 可以使用三个值来自定义映射:

  • 输入架构值指定架构的类型。 可用选项包括 CloudEvents 架构、自定义事件架构或事件网格架构。 默认值为事件网格架构。 在你的架构和事件网格架构之间创建自定义映射时,请使用自定义事件架构。 当事件采用 CloudEvents 格式时,请使用 CloudEvents 架构。

  • “映射默认值”属性指定事件网格架构中字段的默认值。 可以为 subjecteventtypedataversion 设置默认值。 通常情况下,如果自定义架构不包括这三个字段中的一个的对应字段,请使用此参数。 例如,可以指定将数据版本始终设置为 1.0

  • “映射字段”值将字段从你的架构映射到事件网格架构。 请以空格分隔的键/值对形式指定值。 对于键名称,请使用事件网格字段的名称。 对于值,请使用字段的名称。 可以对 idtopiceventtimesubjecteventtypedataversion 使用键名称。

要使用 Azure CLI 创建自定义主题,请使用:

az eventgrid topic create \
  -n demotopic \
  -l chinaeast2 \
  -g myResourceGroup \
  --input-schema customeventschema \
  --input-mapping-fields eventType=myEventTypeField \
  --input-mapping-default-values subject=DefaultSubject dataVersion=1.0

对于 PowerShell,请使用:

New-AzEventGridTopic `
  -ResourceGroupName myResourceGroup `
  -Name demotopic `
  -Location chinaeast2 `
  -InputSchema CustomEventSchema `
  -InputMappingField @{eventType="myEventTypeField"} `
  -InputMappingDefaultValue @{subject="DefaultSubject"; dataVersion="1.0" }

订阅事件网格主题

订阅自定义主题时,请指定要用于接收事件的架构。 可以指定 CloudEvents 架构、自定义事件架构或事件网格架构。 默认值为事件网格架构。

以下示例订阅一个事件网格主题并使用事件网格架构。 对于 Azure CLI,请使用:

topicid=$(az eventgrid topic show --name demoTopic -g myResourceGroup --query id --output tsv)

az eventgrid event-subscription create \
  --source-resource-id $topicid \
  --name eventsub1 \
  --event-delivery-schema eventgridschema \
  --endpoint <endpoint_URL>

下一示例使用事件的输入架构:

az eventgrid event-subscription create \
  --source-resource-id $topicid \
  --name eventsub2 \
  --event-delivery-schema custominputschema \
  --endpoint <endpoint_URL>

以下示例订阅一个事件网格主题并使用事件网格架构。 对于 PowerShell,请使用:

$topicid = (Get-AzEventGridTopic -ResourceGroupName myResourceGroup -Name demoTopic).Id

New-AzEventGridSubscription `
  -ResourceId $topicid `
  -EventSubscriptionName eventsub1 `
  -EndpointType webhook `
  -Endpoint <endpoint-url> `
  -DeliverySchema EventGridSchema

下一示例使用事件的输入架构:

New-AzEventGridSubscription `
  -ResourceId $topicid `
  -EventSubscriptionName eventsub2 `
  -EndpointType webhook `
  -Endpoint <endpoint-url> `
  -DeliverySchema CustomInputSchema

将事件发布到主题

现在可以将事件发送到自定义主题并查看映射结果了。 以下脚本采用示例架构发布事件:

对于 Azure CLI,请使用:

endpoint=$(az eventgrid topic show --name demotopic -g myResourceGroup --query "endpoint" --output tsv)
key=$(az eventgrid topic key list --name demotopic -g myResourceGroup --query "key1" --output tsv)

event='[ { "myEventTypeField":"Created", "resource":"Users/example/Messages/1000", "resourceData":{"someDataField1":"SomeDataFieldValue"} } ]'

curl -X POST -H "aeg-sas-key: $key" -d "$event" $endpoint

对于 PowerShell,请使用:

$endpoint = (Get-AzEventGridTopic -ResourceGroupName myResourceGroup -Name demotopic).Endpoint
$keys = Get-AzEventGridTopicKey -ResourceGroupName myResourceGroup -Name demotopic

$htbody = @{
    myEventTypeField="Created"
    resource="Users/example/Messages/1000"
    resourceData= @{
        someDataField1="SomeDataFieldValue"
    }
}

$body = "["+(ConvertTo-Json $htbody)+"]"
Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -Headers @{"aeg-sas-key" = $keys.Key1}

现在,请查看 WebHook 终结点。 这两个订阅以不同架构分发了事件。

第一个订阅使用了事件网格架构。 已分发事件的格式为:

{
  "id": "aa5b8e2a-1235-4032-be8f-5223395b9eae",
  "eventTime": "2018-11-07T23:59:14.7997564Z",
  "eventType": "Created",
  "dataVersion": "1.0",
  "metadataVersion": "1",
  "topic": "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.EventGrid/topics/demotopic",
  "subject": "DefaultSubject",
  "data": {
    "myEventTypeField": "Created",
    "resource": "Users/example/Messages/1000",
    "resourceData": {
      "someDataField1": "SomeDataFieldValue"
    }
  }
}

这些字段包含来自自定义主题的映射。 myEventTypeField 映射到 EventType。 使用 DataVersion 和“主题”的默认值。 “数据”对象包含原始的事件架构字段。

第二个订阅使用了输入事件架构。 已分发事件的格式为:

{
  "myEventTypeField": "Created",
  "resource": "Users/example/Messages/1000",
  "resourceData": {
    "someDataField1": "SomeDataFieldValue"
  }
}

请注意,分发的是原始字段。

后续步骤