次の方法で共有


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 スキーマ内のイベントの場合、キーには eventidsourceeventtypeeventtypeversion、またはイベント データ (例: data.key1) の値を使用します。

Event Grid Basic レベルを使用している場合、Event Grid スキーマ内のイベントには、キーの値として IDTopicSubjectEventTypeDataVersion、またはイベント データ (例: data.key1) を使用します。 カスタム入力スキーマの場合は、イベント データ フィールドを使用します (例: data.key1)。 data セクション内のフィールドにアクセスするには、. (ドット) 表記を使用します。 たとえば、次のサンプル イベントの siteName または action にアクセスするには、それぞれ data.siteNamedata.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]、およびフィルターに範囲の配列を使用した擬似コードを次に示します。 この擬似コードでは、ab は配列内の各範囲の最小値と最大値です。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。

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]、およびフィルターに範囲の配列を使用した擬似コードを次に示します。 この擬似コードでは、ab は配列内の各範囲の最小値と最大値です。 データ型がフィルターのデータ型と一致しないキー値はすべて無視されます。

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 属性の値に部分文字列として contosofabrikam が含まれていない場合にのみ、この演算子は 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 hubsevent で始まります。

"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 属性の値が jpgjpeg、または png で終わるかどうかが確認されます。 たとえば、eventgrid.pngpng で終わります。

"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 属性の値が jpgjpeg、または 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 属性の値が contosofabrikam、または 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 属性の値が awsbridge のどちらでもないかどうかが確認されます。

"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 スキーマ内のイベントの場合、キーには eventidsourceeventtypeeventtypeversion、またはイベント データ (例: data.key1) の値を使用します。

CloudEvents 1.0 の拡張コンテキスト属性を使用することもできます。 次の例で、comexampleextension1comexampleothervalue は拡張コンテキスト属性です。

{
    "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/authnclassreferencejohn.doe@contoso.com などです。 現時点では、エスケープ文字を含むキーはサポートされていません。

複数のフィルターで同じキーを使用できます。

次のステップ