🔥

AWS WAFv2 レートベースルールのレート評価の挙動

2024/03/01に公開

developers.io にて AWS WAFv2 のレートベースルールの評価期間が 5 分固定から最小 1 分まで指定できるようになったという情報が出てきました。(What's new にまだ出てない情報なのに、どこから気づいていらっしゃるのか...)

https://dev.classmethod.jp/articles/aws-waf-rate-evaluation-window/

ぼくとしては「評価期間もっと短くしてくれ〜〜〜」と思い続けてきたので待望の機能だったわけですが、そういえば WAF の評価の挙動ってどうなっているんだ? というのが気になり。

実際にリクエストを投げつけての確認は上記ブログにてされているのですが、改めて AWS の公式ドキュメントからレートリミットの挙動に関して確認してみました。

評価の挙動

ざっくり、以下のようになっています。
(N の値を 1, 2, 5, 10 に指定できるようになった、というのが上記ブログのアップデート内容)

  • 約 10 秒ごとに一回、過去 N 分間のリクエストを遡ってレートを評価
    • レート制限に引っかかっている場合、リクエストをブロック
    • レート制限に引っ掛からなくなった場合、リクエストブロックを解除
  • レートの評価 + 伝播による遅延などの要因でリクエストブロック / リクエストブロック解除には最大 30 秒程度かかる可能性がある
    • 通常は 20 秒以内には反映される

勝手な想像で設定した期間内のリクエストをカウントアップで評価していくのかと思っていたのですが、そうではないということですね。(実装考えたらカウントアップはしんどそうなので当たり前かもしれない) 評価は設定した直後から行われる、とのことなので、設定した瞬間に過去 N 分間のリクエストを見てレートを評価してくれるようです。

例えば、今まさに大量のリクエストを受けていてレートリミットを追加で設定した場合、そこから N 分間後に制限が発動するのではなく最大 30 秒でブロックが効き始めます。逆にリクエスト量が減ってきた場合速やかにブロックが解除されるのではなく、過去 N 分間のリクエストが閾値より下回ってから最大 30 秒後に解除されます。

細かな注意事項

改めてドキュメントを読んで知った注意事項を載せておきます。

  1. レートベースルールは直近のリクエストに重みを持たせるアルゴリズムでリクエスト量を推定するため、厳密にリクエスト回数と制限リクエスト数が一致するわけではない
    • ドキュメントに値を書き込んで外向けに公開するようなレート制限には不向き
  2. 使用中のレートベースルールの設定を更新するとレート制限カウントがリセットされるため、最大 1 分間レート制限が止まる可能性がある
    • 地味にしらなかったけど割と大事そう
    • 大量リクエストを受けている最中にレート制限をキツくしようと思って値を更新すると、逆に 1 分間無防備になる可能性がある

参考

この辺読んだだけなので、自分で読むぜ! という方はドキュメントを参照してくださいませ。

https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-rate-based-high-level-settings.html

https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-rate-based-caveats.html

Discussion