Compartir a través de


Asignación de campos personalizados a esquemas de Event Grid

Si los datos del evento no coinciden con el esquema de Event Grid esperado, podrá seguir usando Event Grid para enrutar el evento a los suscriptores. En este artículo se describe cómo asignar el esquema al de Event Grid.

Esquema del evento original

Supongamos que tiene una aplicación que envía eventos con el siguiente formato:

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

Aunque dicho formato no coincide con el esquema requerido, Event Grid permite asignar los campos al esquema. También pueden recibir los valores en el esquema original.

Creación de temas personalizados con campos asignados

Al crear un tema personalizado, especifique cómo asignar campos del evento original al esquema de Event Grid. Hay tres valores que se pueden usar para personalizar la asignación:

  • El valor del esquema de entrada especifica el tipo de esquema. Las opciones disponibles son el esquema de CloudEvents, el esquema de eventos personalizados o el esquema de Event Grid. El valor predeterminado es el esquema de Event Grid. Al crear la asignación personalizada entre el esquema y el esquema de Event Grid, use el esquema de eventos personalizados. Si los eventos están en el formato CloudEvents, use el esquema CloudEvents.

  • La propiedad mapping default values (asignación de valores predeterminados) especifica los valores predeterminados para los campos en el esquema de Event Grid. Puede establecer valores predeterminados para subject, eventtype y dataversion. Normalmente, se usa este parámetro si el esquema personalizado no incluye un campo que se corresponde con alguno de esos tres campos. Por ejemplo, puede especificar que la versión de datos siempre se establezca en 1.0.

  • El valor de mapping fields (asignación de campos) asigna los campos del esquema al esquema de Event Grid. Especifique los valores en pares clave-valor separados por espacios. Para el nombre de clave, usa el nombre del campo de Event Grid. Para el valor, utilice el nombre del campo. Puede usar nombres de clave para id, topic, eventtime, subject, eventtype y dataversion.

Para crear un tema personalizado con la CLI de Azure, use:

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 PowerShell, use:

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

Suscripción a temas de Event Grid

Al suscribirse al tema personalizado, especifique el esquema que le gustaría utilizar para recibir los eventos. Puede especificar el esquema de CloudEvents, el esquema de eventos personalizados o el esquema de Event Grid. El valor predeterminado es el esquema de Event Grid.

En el ejemplo siguiente se realiza la suscripción a un tema de Event Grid y se usa el esquema de Event Grid. Para la CLI de Azure, utilice:

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>

En el ejemplo siguiente se usa el esquema de entrada del evento:

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

En el ejemplo siguiente se realiza la suscripción a un tema de Event Grid y se usa el esquema de Event Grid. Para PowerShell, use:

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

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

En el ejemplo siguiente se usa el esquema de entrada del evento:

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

Publicación de eventos en temas

Ahora ya puede enviar un evento al tema personalizado y ver el resultado de la asignación. A continuación se indica el script para publicar un evento en el esquema de ejemplo:

Para la CLI de Azure, utilice:

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 PowerShell, use:

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

Ahora, examinemos el punto de conexión de WebHook. Las dos suscripciones entregaron eventos en diferentes esquemas.

La primera suscripción usó el esquema de Event Grid. El formato del evento entregado es:

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

Estos campos contienen las asignaciones del tema personalizado. myEventTypeField se asigna a EventType. Se usan los valores predeterminados para DataVersion y Subject. El objeto Data contiene los campos del esquema del evento original.

La segunda suscripción usó el esquema del evento de entrada. El formato del evento entregado es:

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

Tenga en cuenta que se entregaron los campos originales.

Pasos siguientes