Event Grid スキーマへのカスタム フィールドのマップ

イベント データと必要な Event Grid スキーマが一致しない場合でも、Event Grid を使用して、イベントをサブスクライバーにルーティングできます。 この記事では、カスタム スキーマを Event Grid スキーマにマップする方法について説明します。

元のイベント スキーマ

次の形式でイベントを送信するアプリケーションがあるとします。

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

この形式は必要なスキーマと一致しませんが、Event Grid を使用して、フィールドをスキーマにマップできます。 つまり、元のスキーマの値を受け取ることができます。

フィールドをマップしたカスタム トピックの作成

カスタム トピックを作成する際に、元のイベントのフィールドを Event Grid スキーマにマップする方法を指定します。 マッピングをカスタマイズする際に使用する値として、次の 3 つがあります。

  • --input-schema の値では、スキーマのタイプを指定します。 使用可能なオプションは、CloudEvents スキーマ、カスタム イベント スキーマ、または Event Grid スキーマです。 既定値は、Event Grid スキーマです。 カスタム スキーマと Event Grid スキーマの間のカスタム マッピングを作成する場合は、カスタム イベント スキーマを使用します。 イベントが CloudEvents フォーマット内にある場合は、CloudEvents スキーマを使用します。

  • -mapping-default-values プロパティでは、Event Grid スキーマ内のフィールドの既定値を指定します。 subjecteventtype、および dataversion の既定値を指定できます。 通常、これらの 3 つのフィールドのいずれかに対応するフィールドがカスタム スキーマに含まれていない場合に、このパラメーターを使用します。 たとえば、dataversion が常に 1.0 に設定されるように指定できます。

  • -mapping-fields の値により、スキーマのフィールドが Event Grid スキーマにマッピングされます。 値はスペースで区切ったキー/値のペアで指定します。 キー名には、Event Grid フィールドの名前を使用します。 値には、カスタム フィールドの名前を使用します。 idtopiceventtimesubjecteventtype、および dataversion ではキー名を使用できます。

Azure CLI でカスタム トピックを作成するには、次を使用します。

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

PowerShell では、次を使用します。

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

Event Grid トピックのサブスクライブ

カスタム トピックをサブスクライブする場合は、イベントの受信に使用するスキーマを指定します。 CloudEvents スキーマ、カスタム イベント スキーマ、または Event Grid スキーマのいずれかを指定します。 既定値は、Event Grid スキーマです。

次の例では、Event Grid トピックをサブスクライブし、Event Grid スキーマを使用します。 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>

次の例では、Event Grid トピックをサブスクライブし、Event Grid スキーマを使用します。 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 エンドポイントを確認します。 2 つのサブスクリプションで異なるスキーマを使ってイベントが配信されています。

最初のサブスクリプションでは、Event Grid スキーマを使用しました。 配信されたイベントの形式は次のとおりです。

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

これらのフィールドには、カスタム トピックのマッピングが含まれています。 myEventTypeFieldEventType にマップされています。 DataVersionSubject の既定値が使用されています。 Data オブジェクトには元のイベント スキーマのフィールドが含まれています。

2 つ目のサブスクリプションでは、入力イベント スキーマを使用しました。 配信されたイベントの形式は次のとおりです。

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

元のフィールドが配信されていることに注目してください。

次のステップ