Mappa anpassade fält till ett Event Grid-schema

Om dina händelsedata inte matchar det förväntade Event Grid-schemat kan du fortfarande använda Event Grid för att dirigera händelsen till prenumeranter. Den här artikeln beskriver hur du mappar schemat till Event Grid-schemat.

Ursprungligt händelseschema

Anta att du har ett program som skickar händelser i följande format:

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

Även om formatet inte matchar det schema som krävs kan du mappa fälten till schemat med Event Grid. Eller så kan du ta emot värdena i det ursprungliga schemat.

Skapa anpassat ämne med mappade fält

När du skapar ett anpassat ämne anger du hur du mappar fält från den ursprungliga händelsen till event grid-schemat. Det finns tre värden som du använder för att anpassa mappningen:

  • Indataschemavärdet anger typ av schema. De tillgängliga alternativen är CloudEvents-schema, anpassat händelseschema eller Event Grid-schema. Standardvärdet är Event Grid-schema. När du skapar anpassad mappning mellan schemat och event grid-schemat använder du anpassat händelseschema. När händelser är i CloudEvents-format använder du CloudEvents-schemat.

  • Egenskapen mappning av standardvärden anger standardvärden för fält i Event Grid-schemat. Du kan ange standardvärden för subject, eventtypeoch dataversion. Vanligtvis använder du den här parametern när ditt anpassade schema inte innehåller ett fält som motsvarar ett av dessa tre fält. Du kan till exempel ange att dataversionen alltid är inställd på 1.0.

  • Mappningsfälten mappar fält från schemat till schemat för händelserutnät. Du anger värden i blankstegsavgränsade nyckel-/värdepar. För nyckelnamnet använder du namnet på händelserutnätfältet. För värdet använder du namnet på fältet. Du kan använda nyckelnamn för id, topic, eventtime, subject, eventtypeoch dataversion.

Om du vill skapa ett anpassat ämne med Azure CLI använder du:

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

Om du använder PowerShell använder du:

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

Prenumerera på event grid-ämne

När du prenumererar på det anpassade ämnet anger du det schema som du vill använda för att ta emot händelserna. Du anger CloudEvents-schemat, det anpassade händelseschemat eller Event Grid-schemat. Standardvärdet är Event Grid-schema.

I följande exempel prenumererar du på ett event grid-ämne och använder Event Grid-schemat. Om du använder Azure CLI använder du:

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>

I nästa exempel används indataschemat för händelsen:

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

I följande exempel prenumererar du på ett event grid-ämne och använder Event Grid-schemat. Om du använder PowerShell använder du:

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

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

I nästa exempel används indataschemat för händelsen:

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

Publicera händelse till ämne

Nu är du redo att skicka en händelse till det anpassade ämnet och se resultatet av mappningen. Följande skript för att publicera en händelse i exempelschemat:

Om du använder Azure CLI använder du:

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

Om du använder PowerShell använder du:

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

Titta nu på din WebHook-slutpunkt. De två prenumerationerna levererade händelser i olika scheman.

Den första prenumerationen använde event grid-schema. Formatet för den levererade händelsen är:

{
  "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"
    }
  }
}

De här fälten innehåller mappningarna från det anpassade ämnet. myEventTypeField mappas till EventType. Standardvärdena för DataVersion och Subject används. Dataobjektet innehåller de ursprungliga händelseschemafälten.

Den andra prenumerationen använde indatahändelseschemat. Formatet för den levererade händelsen är:

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

Observera att de ursprungliga fälten levererades.

Nästa steg