Mappa anpassade fält till ett Event Grid-schema

Om dina händelsedata inte matchar det förväntade schemat Event Grid dufortfarande använda Event Grid för att dirigera händelsen till prenumeranter. I den här artikeln beskrivs hur du mappar ditt schema till Event Grid schema.

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 det formatet inte matchar det schema Event Grid kan du mappa dina fält till schemat. 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 fält ska mappas från den ursprungliga händelsen till event grid-schemat. Det finns tre värden som du använder för att anpassa mappningen:

  • Värdet för indataschemat anger typen 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 ditt schema och event grid-schemat använder du anpassat händelseschema. När händelser är i CloudEvents-format använder du CloudEvents-schemat.

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

  • Mappningsfältens värde mappar fält från ditt schema till Event Grid-schemat. Du anger värden i blankstegsavgränsade nyckel/värde-par. Som nyckelnamn använder du namnet på fältet event grid. För värdet använder du namnet på ditt fält. Du kan använda nyckelnamn för id , , , , och topic eventtime subject eventtype 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 vi på ett Event Grid-ämne och använder Event Grid schema. 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 vi på ett Event Grid-ämne och använder Event Grid schema. 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å WebHook-slutpunkten. 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"
    }
  }
}

Dessa fält innehåller mappningar från det anpassade ämnet. myEventTypeField mappas till EventType. Standardvärdena för DataVersion och Ämne används. Dataobjektet innehåller de ursprungliga fälten för händelseschemat.

I den andra prenumerationen användes schemat för indatahändelsen. 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