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 スキーマ内のフィールドの既定値を指定します。
subject
、eventtype
、およびdataversion
の既定値を指定できます。 通常、これらの 3 つのフィールドのいずれかに対応するフィールドがカスタム スキーマに含まれていない場合に、このパラメーターを使用します。 たとえば、dataversion が常に 1.0 に設定されるように指定できます。-mapping-fields の値により、スキーマのフィールドが Event Grid スキーマにマッピングされます。 値はスペースで区切ったキー/値のペアで指定します。 キー名には、Event Grid フィールドの名前を使用します。 値には、カスタム フィールドの名前を使用します。
id
、topic
、eventtime
、subject
、eventtype
、および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"
}
}
}
これらのフィールドには、カスタム トピックのマッピングが含まれています。 myEventTypeField は EventType にマップされています。 DataVersion と Subject の既定値が使用されています。 Data オブジェクトには元のイベント スキーマのフィールドが含まれています。
2 つ目のサブスクリプションでは、入力イベント スキーマを使用しました。 配信されたイベントの形式は次のとおりです。
{
"myEventTypeField": "Created",
"resource": "Users/example/Messages/1000",
"resourceData": {
"someDataField1": "SomeDataFieldValue"
}
}
元のフィールドが配信されていることに注目してください。
次のステップ
- イベント配信と再試行については、「Event Grid によるメッセージ配信と再試行」をご覧ください。
- Event Grid の概要については、Event Grid の紹介に関する記事を参照してください。
- Event Grid の使用をすぐに開始するには、Azure Event Grid でのカスタム イベントの作成とルーティングに関する記事を参照してください。