S3 EventBridgeイベントのkeyフィルタ、wildcardで直接書けるようになってた

  • AWS
  • EventBridge
  • S3

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

そもそもの話

S3のObject CreatedイベントをEventBridgeで拾って、object keyがaaaa.aa/aaaaa/*.gzみたいなパターンに一致するものだけ発火させたかった。最初は「EventBridgeのイベントパターンにワイルドカードって使えるんだっけ」ってところから確認した。

昔はprefixとsuffixしかなくて、しかもOR判定

以前調べたときの情報だと、EventBridgeのイベントパターンにはワイルドカードはなくて、prefixとsuffixの組み合わせで近いことをやるしかなかった。

{
"detail": {
"object": {
"key": [
{ "prefix": "aaaa.aa/aaaaa/" },
{ "suffix": ".gz" }
]
}
}
}

このパターン、同じ配列の中に複数条件を並べるとOR判定になる。つまり「aaaa.aa/aaaaa/で始まる」または「.gzで終わる」のどちらかを満たせば発火してしまって、両方満たす(AND)条件にはならない。ANDにしたいなら、EventBridge側は広めに拾っておいて、Lambdaなど後続処理で絞り込むしかなかったらしい。

2023年10月からwildcardマッチングに対応してた

AWSの公式アップデート履歴を確認したところ、EventBridgeは2023年10月3日にワイルドカードフィルタリングに対応していた。これを使うと、keyの条件を1つのパターン文字列にまとめられる。

{
"detail": {
"object": {
"key": [
{ "wildcard": "aaaa.aa/aaaaa/*.gz" }
]
}
}
}

これで「aaaa.aa/aaaaa/配下にあって、かつ末尾が.gzのオブジェクト」だけがマッチする。prefixとsuffixを別々に書いてOR判定になってしまう問題がなく、後段でのフィルタも不要になった。

使うときの注意点

  • wildcardはevent busのルールで使える機能で、Pipesなど一部の機能では対応していない場合があるらしい(実機未確認)。
  • ワイルドカード文字(*)を連続で使うのは不可。
  • リテラルの*や\を使いたい場合は\* \\でエスケープする必要がある。
  • ワイルドカードを使いすぎてパターンが複雑になると、ルール作成時にInvalidEventPatternExceptionになることがあるらしい。ARNの固定部分を直書きするなどして、なるべくワイルドカードの数を減らすのが良さそう。

結論

S3のEventBridgeイベントで「特定プレフィックス配下の特定拡張子だけ」拾いたいなら、今はwildcardで一発で書ける。2023年10月より前の情報だと「prefix/suffixしかない」「ANDは直接できない」と書いてあることが多いけど、それはもう古い。