

S3 EventBridgeイベントのkeyフィルタ、wildcardで直接書けるようになってた
この記事は、構成と文章の整理に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は直接できない」と書いてあることが多いけど、それはもう古い。