すこぶる.net

技術系備忘録など

AWS WAF

【AWS WAF】複数の特定パスだけ除外して Rate-based rule を設定する方法

投稿日:

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」にして除外したいパスを正規表現で並べることにしました。
例)

^(/assets/*|/favicon.ico|/api/v5/*)

これによって、一つの条件で複数パスを設定できるため1ルールあたりのキャパシティを超えることはなくなりました。

まとめ

除外したいルールを常に追っていく必要があるため今回の解決策がベストなのかは分かりませんが、今のところ期待した動作になっています。
ページへのリクエストのみをカウントしてブロックしたい場合の参考になればと思います。

-AWS, WAF
-, ,

執筆者:

関連記事

AWS Copilot CLI で Laravel アプリケーションを Fargate にデプロイして Nginx とコンテナ間共有する

Copilot CLI で Fargate にデプロイした Laravel コンテナと Nginx コンテナのファイル共有 AWS Copilot CLI を使用して Laravel フレームワークで …

【Nginx】Amazon S3へリバースプロキシ

Nginx から Amazon S3 へリバースプロキシ 今回は Nginx から Amazon S3 へリバースプロキシする方法について触れたいと思います。 ( 以前はプライベートな S3 へのリバ …

【CloudWatch Log Insights】WAFのログからUser-Agentを抽出する方法

AWS WAF のログからUser-Agent(ユーザーエージェント)を抽出して分析したい AWS WAF のログを CLoudWatch Log Insights で分析した際に、User-Agen …

【AWS Lightsail】データベースのタイムゾーン変更方法

Amazon Lightsail のデータベースのタイムゾーン変更方法について Amazon Lightsail のデーターベースを使っているときに、time_zone を UTC から Asia/T …

【ALB】ターゲットがunhealthyでもつながる仕様

AWS ALBの動作について AWSで使用しているALB(Application Load Balancer)の動作で誤解していたことがあった。 ALB配下にEC2インスタンスを複数台ぶら下げた状況で …