Amazon EventBridge イベントパターンでのコンテンツのフィルタリング
Amazon EventBridge は、イベントパターンを使用した宣言型のコンテンツフィルタリングをサポートしています。コンテンツのフィルタリングを使用すると、非常に限定的な条件下でのみイベントに一致する複雑なイベントパターンを作成できます。例えば、イベントが特定の IP アドレスから発生する場合、またはイベント JSON に特定のフィールドが存在しない場合に限り、イベントのフィールドが特定の数値範囲内にあるときにイベントに一致するイベントパターンを作成することができます。
EventBridge では、ルールが繰り返し開始される無限ループにつながるルールが作成される可能性があります。たとえば、S3 バケットで ACL が変更されたことを検出し、ソフトウェアをトリガーして ACL を目的の状態に変更するルールがあるとします。このルールが慎重に記述されていない場合は、その後 ACL を変更するとルールが再び開始され、無限ループが作成されます。
これを防ぐには、トリガーされたアクションが同じルールを再び開始しないようにルールを記述します。たとえば、変更された後ではなく、エラー状態にある ACL が見つかった場合にのみ、ルールが開始されるようにします。
無限ループにより、予想よりも高い料金がすぐに発生する可能性があります。指定した制限を料金が超えるとアラートで知らせる予算設定を使用することをお勧めします。詳細については、「予算によるコストの管理」を参照してください。
プレフィックスマッチング
イベントソース内の値のプレフィックスに応じてイベントをマッチングすることができます。文字列値にはプレフィックスマッチングを使用できます。
例えば、次のイベントパターンは、"time": "2017-10-02T18:43:48Z"
のように "time"
フィールドが "2017-10-02"
で始まるすべてのイベントに一致します。
{
"time": [ { "prefix": "2017-10-02" } ]
}
「以外」のマッチング
「以外」のマッチングは、ルールで指定されているもの以外のすべてに一致します。
文字列のみを含むリスト、または数字のみを含むリストを含む、文字列および数値で「以外」のマッチングを使用できます。
次のイベントパターンは、文字列と数字を使った「以外」のマッチングを示しています。
{
"detail": {
"state": [ { "anything-but": "initializing" } ]
}
}
{
"detail": {
"x-limit": [ { "anything-but": 123 } ]
}
}
次のイベントパターンは、文字列のリストを使った「以外」のマッチングを示しています。
{
"detail": {
"state": [ { "anything-but": [ "stopped", "overloaded" ] } ]
}
}
次のイベントパターンは、数値のリストを使った「以外」のマッチングを示しています。
{
"detail": {
"x-limit": [ { "anything-but": [ 100, 200, 300 ] } ]
}
}
次のイベントパターンは、"state"
フィールドに "init"
というプレフィックスを持たないすべてのイベントにマッチする、「以外」のマッチングを示しています。
Anything-but マッチングは、リストではなく 1 つのプレフィクスでのみ機能します。
{
"detail": {
"state": [ { "anything-but": { "prefix": "init" } } ]
}
}
数値マッチング
数値マッチングは、JSON 数値である値で動作します。精度が 15 桁 (小数点の右に 6 桁) の -1.0e9 から +1.0e9 までの値に制限されています。
以下は、すべてのフィールドが真であるイベントにのみ一致するイベントパターンの数値マッチングを示しています。
{
"detail": {
"c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ],
"d-count": [ { "numeric": [ "<", 10 ] } ],
"x-limit": [ { "numeric": [ "=", 3.018e2 ] } ]
}
}
IP アドレスマッチング
IP アドレスマッチングは、IPv4 アドレスと IPv6 アドレスに使用できます。次のイベントパターンは、10.0.0 で始まり、0 ~ 255 の数値で終わる IP アドレスに一致する IP アドレスを示しています。
{
"detail": {
"sourceIPAddress": [ { "cidr": "10.0.0.0/24" } ]
}
}
存在マッチング
存在マッチングは、イベントの JSON 内のフィールドの有無に対して機能します。
存在マッチングは、リーフノードでのみ機能します。中間ノードでは機能しません。
次のイベントパターンは、detail.state
フィールドを持つイベントと一致します。
{
"detail": {
"state": [ { "exists": true } ]
}
}
前のイベントパターンは、次のイベントと一致します。
{
"detail-type": [ "EC2 Instance State-change Notification" ],
"resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-02ebd4584a2ebd341" ],
"detail": {
"state": [ "initializing", "running" ]
}
}
前のイベントパターンは、次のイベントとは一致しません。detail.state
フィールドがないからです。
{
"detail-type": [ "EC2 Instance State-change Notification" ],
"resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-02ebd4584a2ebd341" ],
"detail": {
"c-count" : {
"c1" : 100
}
}
}
複数のマッチングを含む複雑な例
複数のマッチングルールを組み合わせて、より複雑なイベントパターンにすることができます。例えば、次のイベントパターンでは、anything-but
と numeric
を組み合わせています。
{
"time": [ { "prefix": "2017-10-02" } ],
"detail": {
"state": [ { "anything-but": "initializing" } ],
"c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ],
"d-count": [ { "numeric": [ "<", 10 ] } ],
"x-limit": [ { "anything-but": [ 100, 200, 300 ] } ]
}
}
イベントパターンを構築するときに、キーを複数回含めると、最後のリファレンスがイベントの評価に使用されるものになります。たとえば、次のパターンの場合:
{ "detail": { "location": [ { "prefix": "us-" } ], "location": [ { "anything-but": "us-east" } ] } }
{ "anything-but": "us-east" }
のみが location
を評価する際に考慮されます。