AWS WAF を使って複数の特定のページ(パス)を除外した Rate-based rule を設定する方法
CloudFront や ALB に対して WAF をアタッチして Rate-based rule を設定する際に、複数のパスを除外したルールを作成したいときがありました。
理由としては、全体に Rate-based rule を設定してしまうと、img, js, css 等の静的コンテンツなど、ページへの1リクエストに対して、そこから呼ばれる他のリクエストも一緒にカウントされてしまうため制限にかかりやすく、また1ユーザあたりのリクエスト数を見積もりづらかったためです。
そこで、”/”, “/company/” などページへのリクエストに対してのみ制限を適用し、カウントしたいため、除外するルールを複数登録することになりました。
問題点
その際に、NOT Scope-down statement を AND で繋ぐ形で複数のパスを登録していきました。
また、1ルールあたり5つしか条件を入れられないため、複数のルールに同じような対応をしました。(ルールを作っている間にできなさそうな感じはしていましたが)
例えば rate-base-limit-1, rate-base-limit-2, rate-base-limit-3 と同じようにそれぞれ除外したいパスを入れていったとします。
しかし、この場合、rate-base-limit-2 や rate-base-limit-3 で設定した除外したいパスは rate-base-limit-1 では考慮されません。それぞれのルールで Allow, Block, Count などを設定していくためそうなることは必然でした。
解決策
「doesn’t match the statement (NOT)」 で、「Match type」を 「Matches regular expression」にして除外したいパスを正規表現で並べることにしました。
例)
これによって、一つの条件で複数パスを設定できるため1ルールあたりのキャパシティを超えることはなくなりました。
まとめ
除外したいルールを常に追っていく必要があるため今回の解決策がベストなのかは分かりませんが、今のところ期待した動作になっています。
ページへのリクエストのみをカウントしてブロックしたい場合の参考になればと思います。