Azure Event Grid 名前空間トピックへのサブスクリプションのイベント フィルター
この記事では、名前空間トピックへのイベント サブスクリプションにフィルターを指定するさまざまな方法について説明します。 フィルターを使用すると、パブリッシャーが宛先エンドポイントへの Event Grid に送信するイベントのサブセットのみを送信できます。 イベント サブスクリプションを作成するとき、フィルター処理を行うためのオプションとして次の 3 つがあります。
- イベントの種類
- 指定の値で開始または終了する件名
- 高度なフィールドおよび演算子
イベントの種類のフィルター処理
既定では、イベント ソースに関するすべてのイベントの種類がエンドポイントに送信されます。 特定のイベントの種類のみをご利用のエンドポイントに送信するように決めることができます。 たとえば、ご利用のリソースに対する更新は通知されても、削除のような他の操作は通知されないようにすることができます。 その場合は、イベントの種類 Microsoft.Resources.ResourceWriteSuccess
でフィルター処理します。 イベントの種類を含む配列を指定するか、またはイベント ソースに関するすべてのイベントの種類を取得する All
を指定します。
イベントの種類でフィルター処理を行うための JSON 構文を次に示します。
"filter": {
"includedEventTypes": [
"Microsoft.Resources.ResourceWriteFailure",
"Microsoft.Resources.ResourceWriteSuccess"
]
}
件名のフィルター処理
件名によるシンプルなフィルター処理の場合は、件名の開始値または終了値を指定します。 たとえば、.txt
で終わる件名を指定することで、ストレージ アカウントへのテキスト ファイルのアップロードに関連するイベントのみを取得できます。 または、/blobServices/default/containers/testcontainer
で終わる件名をフィルター処理することで、ストレージ アカウント内の他のコンテナーではなく、そのコンテナーのすべてのイベントを取得できます。
イベントをカスタム トピックに発行する場合は、サブスクライバーがそのイベントに関心があるかどうかを簡単に知ることができるイベントの件名を作成してください。 サブスクライバーは、件名のプロパティを使用してイベントのフィルター処理またはルーティングを行います。 そのイベントが発生したパスを追加することにより、サブスクライバーがそのパスのセグメントでフィルター処理できるように考慮してください。 このパスにより、サブスクライバーはイベントを狭く、または幅広くフィルター処理できます。 /A/B/C
のように件名に 3 つのセグメント パスを示した場合、サブスクライバーは最初のセグメント /A
でフィルター処理して幅広い一連のイベントを取得できます。 これらのサブスクライバーは、/A/B/C
や /A/D/E
などの件名を持つイベントを取得します。 他のサブスクライバーは、/A/B
でフィルター処理して、より狭い一連のイベントを取得できます。
例 (Blob Storage イベント)
BLOB イベントは、イベントの種類、コンテナー名、作成または削除されたオブジェクトの名前によってフィルター処理できます。
Blob Storage イベントのサブジェクトには次の形式が使われます。
/blobServices/default/containers/<containername>/blobs/<blobname>
ストレージ アカウントのすべてのイベントと一致させるには、サブジェクト フィルターを空のままにできます。
プレフィックスを共有する一連のコンテナーで作成された BLOB からのイベントと一致させるには、次のような subjectBeginsWith
フィルターを使います。
/blobServices/default/containers/containerprefix
特定のコンテナーで作成された BLOB からのイベントと一致させるには、次のような subjectBeginsWith
フィルターを使います。
/blobServices/default/containers/containername/
BLOB 名プレフィックスを共有する特定のコンテナーで作成された BLOB からのイベントと一致させるには、次のような subjectBeginsWith
フィルターを使います。
/blobServices/default/containers/containername/blobs/blobprefix
コンテナーの特定のサブフォルダーに作成された BLOB からのイベントを照合するには、次のような subjectBeginsWith
フィルターを使用します。
/blobServices/default/containers/{containername}/blobs/{subfolder}/
BLOB サフィックスを共有する特定のコンテナーで作成された BLOB からのイベントと一致させるには、".log" や ".jpg" などの subjectEndsWith
フィルターを使います。
高度なフィルター処理
データ フィールド内の値でフィルター処理して、比較演算子を指定するには、高度なフィルター処理オプションを使用します。 高度なフィルター処理では、次を指定します。
- 演算子の種類 - 比較の種類。
- キー - フィルター処理のために使用するイベント データ内のフィールド。 数値、ブール値、文字列、または配列を指定できます。
- 値 - キーと比較する 1 つ以上の値。
Key
キーは、フィルター処理のために使用するイベント データ内のフィールドです。 これは、次のいずれかの型になります。
Number
Boolean
String
Array 型。 この機能を使用するには、
enableAdvancedFilteringOnArrays
プロパティを true に設定する必要があります。"filter": { "subjectBeginsWith": "/blobServices/default/containers/mycontainer/blobs/log", "subjectEndsWith": ".jpg", "enableAdvancedFilteringOnArrays": true }
Cloud Events スキーマ内のイベントの場合、キーには eventid
、source
、eventtype
、eventtypeversion
、またはイベント データ (例: data.key1
) の値を使用します。
Event Grid Basic レベルを使用している場合、Event Grid スキーマ内のイベントには、キーの値として ID
、Topic
、Subject
、EventType
、DataVersion
、またはイベント データ (例: data.key1
) を使用します。 カスタム入力スキーマの場合は、イベント データ フィールドを使用します (例: data.key1
)。 data セクション内のフィールドにアクセスするには、.
(ドット) 表記を使用します。 たとえば、次のサンプル イベントの siteName
または action
にアクセスするには、それぞれ data.siteName
、data.appEventTypeDetail.action
を使用します。
"data": {
"appEventTypeDetail": {
"action": "Started"
},
"siteName": "<site-name>",
"clientRequestId": "None",
"correlationRequestId": "None",
"requestId": "292f499d-04ee-4066-994d-c2df57b99198",
"address": "None",
"verb": "None"
},
注意
Event Grid はオブジェクトの配列に対するフィルター処理をサポートしていません。 文字列、ブール値、数値、および同じ型の配列 (整数配列や文字列配列など) のみを許可します。
値
値には、数値、文字列、ブール値、または配列を指定できます。
オペレーター
数値に対して使用できる演算子は次のとおりです。
NumberIn
キー値が、指定したフィルター値のいずれかである場合、NumberIn 演算子は true に評価されます。 次の例では、これによって data
セクションの counter
属性の値が 5 または 1 であるかどうかが確認されます。
"advancedFilters": [{
"operatorType": "NumberIn",
"key": "data.counter",
"values": [
5,
1
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a, b, c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF filter == key
MATCH
NumberNotIn
キー値が、指定したフィルター値のいずれでもない場合、NumberNotIn 演算子は true に評価されます。 次の例では、これによって data
セクションの counter
属性の値が 41 と 0 のどちらでもないかどうかが確認されます。
"advancedFilters": [{
"operatorType": "NumberNotIn",
"key": "data.counter",
"values": [
41,
0
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a, b, c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF filter == key
FAIL_MATCH
NumberLessThan
キー値が、指定されたフィルター値より小さい場合、NumberLessThan 演算子は true に評価されます。 次の例では、これによって data
セクションの counter
属性の値が 100 より小さいかどうかが確認されます。
"advancedFilters": [{
"operatorType": "NumberLessThan",
"key": "data.counter",
"value": 100
}]
キーが配列の場合は、配列内のすべての値がフィルター値に対して確認されます。 キーに [v1, v2, v3]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH key IN (v1, v2, v3)
IF key < filter
MATCH
NumberGreaterThan
キー値が、指定されたフィルター値より大きい場合、NumberGreaterThan 演算子は true に評価されます。 次の例では、これによって data
セクションの counter
属性の値が 20 より大きいかどうかが確認されます。
"advancedFilters": [{
"operatorType": "NumberGreaterThan",
"key": "data.counter",
"value": 20
}]
キーが配列の場合は、配列内のすべての値がフィルター値に対して確認されます。 キーに [v1, v2, v3]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH key IN (v1, v2, v3)
IF key > filter
MATCH
NumberLessThanOrEquals
キー値が、指定されたフィルター値以下の場合、NumberLessThanOrEquals 演算子は true に評価されます。 次の例では、これによって data
セクションの counter
属性の値が 100 以下かどうかが確認されます。
"advancedFilters": [{
"operatorType": "NumberLessThanOrEquals",
"key": "data.counter",
"value": 100
}]
キーが配列の場合は、配列内のすべての値がフィルター値に対して確認されます。 キーに [v1, v2, v3]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH key IN (v1, v2, v3)
IF key <= filter
MATCH
NumberGreaterThanOrEquals
キー値が、指定されたフィルター値以上の場合、NumberGreaterThanOrEquals 演算子は true に評価されます。 次の例では、これによって data
セクションの counter
属性の値が 30 以上かどうかが確認されます。
"advancedFilters": [{
"operatorType": "NumberGreaterThanOrEquals",
"key": "data.counter",
"value": 30
}]
キーが配列の場合は、配列内のすべての値がフィルター値に対して確認されます。 キーに [v1, v2, v3]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH key IN (v1, v2, v3)
IF key >= filter
MATCH
NumberInRange
キー値が、指定されたフィルター範囲のいずれかである場合、NumberInRange 演算子は true に評価されます。 次の例では、これによって data
セクションの key1
属性の値が、3.14159 から 999.95、3000 から 4000 の 2 つの範囲のいずれかであるかどうかが確認されます。
{
"operatorType": "NumberInRange",
"key": "data.key1",
"values": [[3.14159, 999.95], [3000, 4000]]
}
values
プロパティは範囲の配列です。 前の例では、2 つの範囲の配列です。 確認対象の 1 つの範囲がある配列の例を次に示します。
1 つの範囲の配列:
{
"operatorType": "NumberInRange",
"key": "data.key1",
"values": [[3000, 4000]]
}
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに範囲の配列を使用した擬似コードを次に示します。 この擬似コードでは、a
と b
は配列内の各範囲の最小値と最大値です。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH (a,b) IN filter.Values
FOR_EACH key IN (v1, v2, v3)
IF key >= a AND key <= b
MATCH
NumberNotInRange
キー値が、指定されたフィルター範囲のいずれでもない場合、NumberNotInRange 演算子は true に評価されます。 次の例では、これによって data
セクションの key1
属性の値が、3.14159 から 999.95、3000 から 4000 の 2 つの範囲のいずれかであるかどうかが確認されます。 そうである場合、演算子は false を返します。
{
"operatorType": "NumberNotInRange",
"key": "data.key1",
"values": [[3.14159, 999.95], [3000, 4000]]
}
values
プロパティは範囲の配列です。 前の例では、2 つの範囲の配列です。 確認対象の 1 つの範囲がある配列の例を次に示します。
1 つの範囲の配列:
{
"operatorType": "NumberNotInRange",
"key": "data.key1",
"values": [[3000, 4000]]
}
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに範囲の配列を使用した擬似コードを次に示します。 この擬似コードでは、a
と b
は配列内の各範囲の最小値と最大値です。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH (a,b) IN filter.Values
FOR_EACH key IN (v1, v2, v3)
IF key >= a AND key <= b
FAIL_MATCH
ブール値に対して使用できる演算子は次のとおりです。
BoolEquals です。
キー値が、指定されたブール値フィルターである場合、BoolEquals 演算子は true に評価されます。 次の例では、これによって data
セクションの isEnabled
属性の値が true
かどうかが確認されます。
"advancedFilters": [{
"operatorType": "BoolEquals",
"key": "data.isEnabled",
"value": true
}]
キーが配列の場合は、配列内のすべての値がフィルター ブール値に対して確認されます。 キーに [v1, v2, v3]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH key IN (v1, v2, v3)
IF filter == key
MATCH
文字列に対して使用できる演算子は次のとおりです。
StringContains
指定された任意のフィルター値 (部分文字列) がキー値に含まれている場合、StringContainsは true に評価されます。 次の例では、それによって data
セクションの key1
属性の値に、指定された部分文字列 microsoft
または azure
のいずれかが含まれているかどうかが確認されます。 たとえば、azure data factory
には azure
が含まれています。
"advancedFilters": [{
"operatorType": "StringContains",
"key": "data.key1",
"values": [
"microsoft",
"azure"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF key CONTAINS filter
MATCH
StringNotContains
指定されたフィルター値が部分文字列としてキーに含まれていない場合、StringNotContains 演算子は true に評価されます。 指定された値のいずれかが部分文字列としてキーに含まれている場合、この演算子は false と評価されます。 次の例では、data
セクションの key1
属性の値に部分文字列として contoso
と fabrikam
が含まれていない場合にのみ、この演算子は true を返します。
"advancedFilters": [{
"operatorType": "StringNotContains",
"key": "data.key1",
"values": [
"contoso",
"fabrikam"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF key CONTAINS filter
FAIL_MATCH
この演算子の現在の制限については、「制限事項」を参照してください。
StringBeginsWith
キー値が、指定されたいずれかのフィルター値で始まる場合、StringBeginsWith 演算子は true に評価されます。 次の例では、これによって data
セクションの key1
属性の値が event
または message
で始まるかどうかが確認されます。 たとえば、event hubs
は event
で始まります。
"advancedFilters": [{
"operatorType": "StringBeginsWith",
"key": "data.key1",
"values": [
"event",
"message"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF key BEGINS_WITH filter
MATCH
StringNotBeginsWith
キー値が、指定されたどのフィルター値でも始まらない場合、StringNotBeginsWith 演算子は true に評価されます。 次の例では、これによって data
セクションの key1
属性の値が event
または message
で始まらないかどうかが確認されます。
"advancedFilters": [{
"operatorType": "StringNotBeginsWith",
"key": "data.key1",
"values": [
"event",
"message"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF key BEGINS_WITH filter
FAIL_MATCH
StringEndsWith
キー値が、指定されたいずれかのフィルター値で終わる場合、StringEndsWith 演算子は true に評価されます。 次の例では、これによって data
セクションの key1
属性の値が jpg
、jpeg
、または png
で終わるかどうかが確認されます。 たとえば、eventgrid.png
は png
で終わります。
"advancedFilters": [{
"operatorType": "StringEndsWith",
"key": "data.key1",
"values": [
"jpg",
"jpeg",
"png"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF key ENDS_WITH filter
MATCH
StringNotEndsWith
キー値が、指定されたどのフィルター値でも終わらない場合、StringNotEndsWith 演算子は true に評価されます。 次の例では、これによって data
セクションの key1
属性の値が jpg
、jpeg
、または png
で終わらないかどうかが確認されます。
"advancedFilters": [{
"operatorType": "StringNotEndsWith",
"key": "data.key1",
"values": [
"jpg",
"jpeg",
"png"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF key ENDS_WITH filter
FAIL_MATCH
StringIn
StringIn 演算子を使用すると、キー値が、指定されたフィルター値のいずれかと完全に一致するかどうかが確認されます。 次の例では、これによって data
セクションの key1
属性の値が contoso
、fabrikam
、または factory
であるかどうかが確認されます。
"advancedFilters": [{
"operatorType": "StringIn",
"key": "data.key1",
"values": [
"contoso",
"fabrikam",
"factory"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF filter == key
MATCH
StringNotIn
StringNotIn 演算子を使用すると、キー値が、指定されたどのフィルター値とも一致しないかどうかが確認されます。 次の例では、これによって data
セクションの key1
属性の値が aws
と bridge
のどちらでもないかどうかが確認されます。
"advancedFilters": [{
"operatorType": "StringNotIn",
"key": "data.key1",
"values": [
"aws",
"bridge"
]
}]
キーが配列の場合は、配列内のすべての値がフィルター値の配列に対して確認されます。 キーに [v1, v2, v3]
、およびフィルターに [a,b,c]
を使用した擬似コードを次に示します。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。
FOR_EACH filter IN (a, b, c)
FOR_EACH key IN (v1, v2, v3)
IF filter == key
FAIL_MATCH
すべての文字列の比較では、大文字と小文字は区別されません。
Note
イベント JSON に高度なフィルター キーが含まれていない場合、フィルターは次の演算子に対して一致なしと評価されます: NumberGreaterThan、NumberGreaterThanOrEquals、NumberLessThan、NumberLessThanOrEquals、NumberIn、BoolEquals、StringContains、StringNotContains、StringBeginsWith、StringNotBeginsWith、StringEndsWith、StringNotEndsWith、StringIn。
フィルターは、次の演算子に対して一致ありと評価されます: NumberNotIn、StringNotIn。
IsNullOrUndefined
IsNullOrUndefined 演算子は、キーの値が NULL または未定義の場合に true に評価されます。
{
"operatorType": "IsNullOrUndefined",
"key": "data.key1"
}
次の例では、key1 が指定されていないため、この演算子は true に評価されます。
{
"data":
{
"key2": 5
}
}
次の例では、key1 に NULL が設定されているため、この演算子は true に評価されます。
{
"data":
{
"key1": null
}
}
これらの例で key1 に他の値が含まれている場合、この演算子は false に評価されます。
IsNotNull
IsNotNull 演算子は、キーの値が NULL でも未定義でもない場合に true に評価されます。
{
"operatorType": "IsNotNull",
"key": "data.key1"
}
OR と AND
複数の値を使用した単一のフィルターを指定する場合、OR 操作が実行されます。そのため、キー フィールドの値はそれらの値のいずれかである必要があります。 次に例を示します。
"advancedFilters": [
{
"operatorType": "StringContains",
"key": "Subject",
"values": [
"/providers/microsoft.devtestlab/",
"/providers/Microsoft.Compute/virtualMachines/"
]
}
]
複数の異なるフィルターを指定する場合、AND 操作が実行されます。そのため、各フィルターの条件が満たされる必要があります。 次に例を示します。
"advancedFilters": [
{
"operatorType": "StringContains",
"key": "Subject",
"values": [
"/providers/microsoft.devtestlab/"
]
},
{
"operatorType": "StringContains",
"key": "Subject",
"values": [
"/providers/Microsoft.Compute/virtualMachines/"
]
}
]
CloudEvents
CloudEvents スキーマ内のイベントの場合、キーには eventid
、source
、eventtype
、eventtypeversion
、またはイベント データ (例: data.key1
) の値を使用します。
CloudEvents 1.0 の拡張コンテキスト属性を使用することもできます。 次の例で、comexampleextension1
と comexampleothervalue
は拡張コンテキスト属性です。
{
"specversion" : "1.0",
"type" : "com.example.someevent",
"source" : "/mycontext",
"id" : "C234-1234-1234",
"time" : "2018-04-05T17:31:00Z",
"subject": null,
"comexampleextension1" : "value",
"comexampleothervalue" : 5,
"datacontenttype" : "application/json",
"data" : {
"appinfoA" : "abc",
"appinfoB" : 123,
"appinfoC" : true
}
}
フィルターで拡張コンテキスト属性を使用する例を次に示します。
"advancedFilters": [{
"operatorType": "StringBeginsWith",
"key": "comexampleothervalue",
"values": [
"5",
"1"
]
}]
制限事項
高度なフィルター処理には次の制限事項があります。
- Event Grid サブスクリプションあたり、フィルター全体で高度なフィルターが 25 個とフィルター値が 25 個
- 文字列値あたり 512 文字
.
(ドット) 文字を含むキー。 たとえば、http://schemas.microsoft.com/claims/authnclassreference
やjohn.doe@contoso.com
などです。 現時点では、エスケープ文字を含むキーはサポートされていません。
複数のフィルターで同じキーを使用できます。