次の方法で共有


Azure Event Grid 名前空間のトピックへのサブスクリプションのイベント フィルター

この記事では、名前空間トピックへのイベント サブスクリプションにフィルターを指定するさまざまな方法について説明します。 フィルターを使用すると、パブリッシャーが Event Grid に送信先エンドポイントに送信するイベントのサブセットのみを送信できます。 イベント サブスクリプションを作成する場合、フィルター処理には次の 3 つのオプションがあります。

  • イベントの種類
  • 件名は次で始まるか、または終わる
  • 高度なフィールドと演算子

イベントの種類のフィルター処理

既定では、イベント ソースのすべての イベントの種類 がエンドポイントに送信されます。 エンドポイントに送信できるのは、特定のイベントの種類のみです。 たとえば、リソースの更新の通知を受け取ることができますが、削除などの他の操作については通知されません。 その場合は、 Microsoft.Resources.ResourceWriteSuccess イベントの種類でフィルター処理します。 イベントの種類を配列に指定するか、イベント ソースのすべてのイベントの種類を取得する All を指定します。

イベントの種類によるフィルター処理の JSON 構文は次のとおりです。

"filter": {
  "includedEventTypes": [
    "Microsoft.Resources.ResourceWriteFailure",
    "Microsoft.Resources.ResourceWriteSuccess"
  ]
}

件名のフィルター処理

件名による単純なフィルター処理の場合は、件名の開始値または終了値を指定します。 たとえば、ストレージ アカウントへのテキスト ファイルのアップロードに関連するイベントのみを取得するために、件名を .txt で終了するように指定できます。 または、 /blobServices/default/containers/testcontainer で始まる件名をフィルター処理して、ストレージ アカウント内の他のコンテナーではなく、そのコンテナーのすべてのイベントを取得できます。

カスタム トピックにイベントを発行する場合は、イベントの件名を作成して、サブスクライバーがイベントに関心があるかどうかを簡単に把握できるようにします。 サブスクライバーは 、subject プロパティを使用してイベントをフィルター処理およびルーティングします。 サブスクライバーがそのパスのセグメントでフィルター処理できるように、イベントが発生した場所のパスを追加することを検討してください。 このパスを使用すると、サブスクライバーはイベントを絞り込んだり、広くフィルター処理したりできます。 件名に /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 フィルターを使用します。

高度なフィルター処理

データ フィールドの値でフィルター処理し、比較演算子を指定するには、高度なフィルター処理オプションを使用します。 高度なフィルター処理では、次の項目を指定します。

  • 演算子の型 - 比較の型。
  • key - フィルター処理に使用するイベント データのフィールド。 数値、ブール値、文字列、または配列を指定できます。
  • values - キーと比較する値。

Key

キーは、フィルター処理に使用するイベント データのフィールドです。 次のいずれかの種類を指定できます。

  • Number

  • ブール値

  • String

  • 配列。 この機能を使用するには、 enableAdvancedFilteringOnArrays プロパティを true に設定する必要があります。

    "filter":
    {
        "subjectBeginsWith": "/blobServices/default/containers/mycontainer/blobs/log",
        "subjectEndsWith": ".jpg",
        "enableAdvancedFilteringOnArrays": true
    }
    

Cloud Events スキーマのイベントの場合は、キーに次の値を使用します:eventidsourceeventtypeeventtypeversion、またはイベント データ (data.key1 など)。

Event Grid の基本レベルを使用している場合は、 Event Grid スキーマのイベントに対して、キーに IDTopicSubjectEventTypeDataVersion、またはイベント データ ( data.key1 など) の値を使用します。 カスタム入力スキーマの場合は、イベント データ フィールド (data.key1 など) を使用します。 データ セクションのフィールドにアクセスするには、 . (ドット) 表記を使用します。 たとえば、data.siteName、次のサンプル イベントのsiteNameまたはactionにアクセスする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] とフィルター: 範囲の配列。 この擬似コードでは、 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属性の値がjpgまたはjpegまたは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属性の値がcontosoか、fabrikamfactoryかを確認します。

"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

すべての文字列比較では、大文字と小文字は区別されません。

イベント JSON に高度なフィルター キーが含まれていない場合、フィルターは、NumberGreaterThan、NumberGreaterThanOrEquals、NumberLessThan、NumberLessThanOrEquals、NumberIn、BoolEquals、StringContains、StringNotContains、StringBeginsWith、StringNotBeginsWith、StringEndsWith、StringNotEndsWith、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 AND

複数の値を持つ 1 つのフィルターを指定した場合、 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 スキーマのイベントの場合は、キーに次の値を使用します:idsourcetypedataschema、またはイベント データ (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 などです。 現時点では、キー内のエスケープ文字はサポートされません。

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

次のステップ