Partilhar via


Mapear campos personalizados no esquema do Event Grid

Se os dados do evento não corresponderem ao esquema esperado do Event Grid, ainda pode utilizar o Event Grid para encaminhar eventos para subscritores. Este artigo descreve como mapear o esquema para o esquema do Event Grid.

Esquema de evento original

Vamos supor que tem uma aplicação que envia eventos no seguinte formato:

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

Embora esse formato não corresponda ao esquema necessário, o Event Grid permite-lhe mapear os campos para o esquema. Em alternativa, pode receber os valores no esquema original.

Criar um tópico personalizado com campos mapeados

Ao criar um tópico personalizado, especifique como mapear campos do seu evento original para o esquema do event grid. Existem três valores que utiliza para personalizar o mapeamento:

  • O valor do esquema de entrada especifica o tipo de esquema. As opções disponíveis são o esquema CloudEvents, o esquema de eventos personalizado ou o esquema do Event Grid. O valor predefinido é o esquema do Event Grid. Ao criar um mapeamento personalizado entre o esquema e o esquema do event grid, utilize o esquema de eventos personalizado. Quando os eventos estiverem no formato CloudEvents, utilize o esquema CloudEvents.

  • A propriedade de valores predefinidos de mapeamento especifica valores predefinidos para campos no esquema do Event Grid. Pode definir valores predefinidos para subject, eventtypee dataversion. Normalmente, utiliza este parâmetro quando o esquema personalizado não inclui um campo que corresponda a um desses três campos. Por exemplo, pode especificar que a versão de dados está sempre definida como 1.0.

  • O valor dos campos de mapeamento mapeia campos do esquema para o esquema da grelha de eventos. Especifique valores em pares chave/valor separados por espaços. Para o nome da chave, utilize o nome do campo event grid. Para o valor, utilize o nome do seu campo. Pode utilizar nomes de chaves para id, topic, eventtime, subject, eventtypee dataversion.

Para criar um tópico personalizado com a CLI do Azure, utilize:

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

Para o PowerShell, utilize:

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

Subscreva o tópico do Event Grid

Ao subscrever o tópico personalizado, especifique o esquema que pretende utilizar para receber os eventos. Especifique o esquema CloudEvents, o esquema de eventos personalizado ou o esquema do Event Grid. O valor predefinido é o esquema do Event Grid.

O exemplo seguinte subscreve um tópico do Event Grid e utiliza o esquema do Event Grid. Na CLI do Azure, utilize:

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>

O exemplo seguinte utiliza o esquema de entrada do evento:

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

O exemplo seguinte subscreve um tópico do Event Grid e utiliza o esquema do Event Grid. Para o PowerShell, utilize:

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

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

O exemplo seguinte utiliza o esquema de entrada do evento:

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

Publicar evento no tópico

Agora, está pronto para enviar um evento para o tópico personalizado e ver o resultado do mapeamento. O seguinte script para publicar um evento no esquema de exemplo:

Na CLI do Azure, utilize:

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

Para o PowerShell, utilize:

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

Agora, observe o ponto final do WebHook. As duas subscrições entregaram eventos em esquemas diferentes.

A primeira subscrição utilizou o esquema do event grid. O formato do evento entregue é:

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

Estes campos contêm os mapeamentos do tópico personalizado. myEventTypeField está mapeado para EventType. São utilizados os valores predefinidos para DataVersion e Subject . O objeto Dados contém os campos de esquema de eventos originais.

A segunda subscrição utilizou o esquema de evento de entrada. O formato do evento entregue é:

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

Repare que os campos originais foram entregues.

Passos seguintes