イベントとフィルターの一致

イベントをルールのパターン・フィルタと照合して自動化を構築します。

背景

フィルタを理解する際に、実際のイベント・メッセージの構造を確認すると役立ちます。イベントでは、JSONオブジェクトを使用してイベントを表します。次にイベントを示します:

{
	"cloudEventsVersion": "0.1",
	"eventID": "<unique_ID>",
	"eventType": "com.oraclecloud.objectstorage.deletebucket",
	"source": "objectstorage",
	"eventTypeVersion": "1.0",
	"eventTime": "2019-01-10T21:19:24Z",
	"contentType": "application/json",
	"extensions": {
		"compartmentId": "ocid1.compartment.oc1..<unique_ID>"
	},
	"data": {
		"compartmentId": "ocid1.compartment.oc1..<unique_ID>",
		"compartmentName": "example_name",
		"resourceName": "my_bucket",
		"resourceId": "ocid1.compartment.oc1..<unique_ID>",
		"availabilityDomain": "NfHZ:PHX-AD-2",
		"freeFormTags": {
			"Department": "Finance"
		},
		"definedTags": {
			"Operations": {
				"CostCenter": "42"
			}
		},
		"additionalDetails": {
			"namespace": "example_namespace",
			"publicAccessType": "NoPublicAccess",
			"eTag": "f8ffb6e9-f602-460f-a6c0-00b5abfa24c7"
		}
	}
}

すべてのイベントに関する注意事項は、次の2つです:

  • イベントにはすべて同じ最上位属性セットがあります。これらはイベント・エンベロープと呼ばれます。例外が1つありますが、これらの最上位属性のほとんどはフィルタの作成に有用ではありません。例外はeventTypeで、これはペイロードに含まれるイベントのタイプを識別します。
  • イベントのペイロードはdata属性内に表示されます。このフィールドの情報は、イベントを生成したサービスおよび要求したイベント・タイプによって異なります。ペイロード内の情報は、フィルタによってあるイベントを別のイベントから分離する場合に役立ちます。

エンベロープの詳細は、イベント・メッセージの内容を参照してください。イベントを生成するすべてのサービスのリストは、イベントを生成するサービスを参照してください。

フィルタと一致するイベント

ルールでは、フィルタを使用してイベントを選択し、それらをアクション・リソースに配信します。ルールは、イベントと同様に、JSONオブジェクトとして表されます。フィルタはルールの属性で、属性はconditionという名前です。フィルタは、イベントと一致するか、一致しないかのいずれかです。

フィルタに関する注意事項は次のとおりです:

  • フィルタで指定されていないフィールドは無視されます。2つの中カッコを持つすべてのイベント・メッセージと一致する有効なフィルタを作成できます。
  • フィルタがイベントと一致するには、フィルタにリストされているすべてのフィールド名がイベントに含まれている必要があります。フィールド名は、イベントで使用されているものと同じネスト構造でフィルタに表示される必要があります。
  • ルールは、作成するコンパートメントおよび子コンパートメントのイベントに適用されます。つまり、ルールによって指定されたフィルタは、同じコンパートメントまたは子コンパートメントのリソースから発行されたイベントのみと一致します。
  • ワイルドカード一致はアスタリスク(*)文字でサポートされています。フィルタのワイルドカード一致の例を参照してください。

単純フィルタの例

次のフィルタは、ルールを作成するコンパートメントおよび子コンパートメントのすべてのイベントと一致します。

{
... 

	"condition": "{ }"

}

フィールドをフィルタに追加すると、フィルタと一致する可能性のあるイベントが制限されます。たとえば、次のフィルタはdeletebucketイベントのみと一致します。

{
...

	"condition": "{
		"eventType": "com.oraclecloud.objectstorage.deletebucket"
	}"
}

複数のイベント・タイプのフィルタを作成するには、eventTypeの配列を使用します。次のフィルタは、deletebucketおよびcreatebucketイベントと一致します。

{
...

	"condition": "{
		"eventType": [
			"com.oraclecloud.objectstorage.deletebucket",
			"com.oraclecloud.objectstorage.createbucket"
		]
	}"
}

イベント・ペイロード属性を含むフィルタの例

次の両方のフィルタは、ページ上部のイベントと一致します。1つ目は、フィルタで2つのフィールドを指定して両方のフィールドがイベントに出現するため一致し、2つ目は、イベントに「NoPublicAccess」タイプが出現するため、一致します。

注意すべき重要な事項は、フィルタ内のフィールド名がイベントのネスト構造とどのように一致するかです。

{
...

	"condition": "{
		"data": {
			"compartmentName": "example_name",
			"resourceName": "my_bucket"
		}
	}"
}
{
...

	"condition": "{
		"data": {
			"additionalDetails": {
				"publicAccessType": "NoPublicAccess"
			}
		}
	}"
}

次のフィルタのいずれも、このページ上部のイベントと一致しません。1つ目は、フィルタがイベントで見つからないPublicAccessTypeを指定するため一致しません。2つ目は、イベントで異なるバケットの名前を指定するため一致しません。

{
...

	"condition": "{
		"data": {
			"compartmentName": "example_name",
			"resourceName": "my_bucket",
			"additionalDetails": {
				"publicAccessType": "PublicAccess"
			}
		}
	}"
}
{
...

	"condition": "{
		"data": {
			"additionalDetails": {
				"publicAccessType": "NoPublicAccess"
			}
		}
	}"
}

フィルタの配列の例

フィルタの配列は、フィルタのいずれかの値がイベントの値と一致する場合にイベントと一致します。次のフィルタは、イベント内のバケットの名前がフィルタの配列に含まれているため、ページ上部のイベントと一致します。

{
...

	"condition": "{
		"data": {
			"resourceName": [
				"my_bucket_2",
				"my_bucket_1",
				"my_bucket"
			],
			"additionalDetails": {
				"namespace": "example_namespace",
				"publicAccessType": "NoPublicAccess"
			}
		}
	}"
}

配列はeventType(または最上位フィールドのいずれか)で使用することも、前述の例に示されているイベント・ペイロードを使用することも、イベント・ペイロードと最上位フィールドの両方を使用することもできます。

{
...

	"condition": "{
		"eventType": [
			"com.oraclecloud.objectstorage.deletebucket",
			"com.oraclecloud.objectstorage.createbucket"
		],
		"data": {
			"resourceName": [
				"my_bucket_2",
				"my_bucket_1",
				"my_bucket"
			],
			"additionalDetails": {
				"namespace": "example_namespace",
				"publicAccessType": "NoPublicAccess"
			}
		}
	}"
}

フィルタのワイルドカード一致の例

次に、ワイルドカードとフィルタの一致について考慮する点をいくつか示します。

  • 属性値にのみワイルドカードを使用します。キーでの一致にはアスタリスクを使用できません。
  • アスタリスクのみを含む属性値は、関連付けられた属性名のすべての値と一致しますが、nullとは一致しません
  • ピリオド文字は、フィルタでは特殊な意味はありません。

アスタリスクは文字列の開始時、中間、または末尾に追加できます。この後に続くすべてのフィルタは、ページ上部にあるイベントと一致します。

  • 1つ目は、displayNameのワイルドカードがバケット・ネーミング・パターンと一致するため、一致します。
  • 2つ目は、publicAccessTypeでワイルドカードが使用されるために一致します。ワイルドカードを使用するため、最初の2つのフィルタは、同様のネーミング・パターンを持つバケットのイベントと一致し、パブリック・アクセスの有無にかかわらずバケットのイベントを含みます。
  • 3つ目は、イベント・タイプにすべてのタイプのバケット・イベントが含まれるため、一致します。
{

...
	"condition": "{

		"data": {
			"resourceName": "my_bucket*",
			"additionalDetails": {
				"namespace": "example_namespace",
				"publicAccessType": "NoPublicAccess"
			}
		}
	}"
}
{
...

	"condition": "{

		"data": {
			"resourceName": [
				"my_bucket_2",
				"my_bucket_1",
				"my_bucket"
			],
			"additionalDetails": {
				"namespace": "example_namespace",
				"publicAccessType": "*"
			}
		}
	}"
}
{
...

	"condition": "{
		"eventType": "com.oraclecloud.objectstorage.*bucket",

		"data": {
			"resourceName": [
				"my_bucket_2",
				"my_bucket_1",
				"my_bucket"
			],
			"additionalDetails": {
				"namespace": "example_namespace",
				"publicAccessType": "NoPublicAccess"
			}
		}
	}"
}