CloudFront Connection Functions で接続拒否した時、AWS WAF の料金は発生するのか?

記事タイトルとURLをコピーする

こんにちは、サーバーワークスの山本です。

先日、CloudFront Connection Functions を利用した IP 制限の実装を検討していた際に、「AWS WAF との実行順序」とそれに伴う「課金」について疑問が生じました。 AWS サポートに問い合わせて明確な回答をいただきましたので、その内容を共有します。

疑問:WAF の料金はかかってしまうのか?

CloudFront でアクセス制御を行う際、一般的には AWS WAF や CloudFront Functions を利用することが多いかと思います。 これまでのドキュメントや構成図(例:CloudFrontとCloudFront FunctionsによるECサイトのVisitor Prioritization)を見ると、リクエストの処理フローは通常以下のようになっています。

  1. AWS WAF (リクエスト検査)
  2. CloudFront Functions

この順序だと、仮に後段の CloudFront Functions で 403 Forbidden を返してブロックしたとしても、その前段階で WAF がリクエストを検査しているため、WAF のリクエスト検査料金($0.60/100万回)は発生してしまうことになります。

今回検討していた CloudFront Connection Functions についても同様に、「結局 WAF が先に動いてしまい、ブロックしたとしても WAF のコストは掛かってしまうのではないか?」という点が懸念点でした。

結論:Connection Functions でブロックすれば、WAF 料金は発生しない

AWS サポートからの回答は「No(WAF料金は発生しない)」でした。 理由は、両者が動作するネットワークレイヤの違いにあります。

HTTPS で接続する場合、通信は以下の順序で行われます。

  1. TCP 3-way handshake
  2. TLS handshake
  3. HTTP request

ここでの重要なポイントは以下の2点です。

  • CloudFront Connection Functions「2. TLS handshake」 中に動作する
  • AWS WAFCloudFront Functions「3. HTTP request」 を評価する

つまり、Connection Functions で IP アドレス制限などに抵触して接続が拒否された場合、通信は TLS handshake 中に失敗します。その結果、後続の HTTP リクエスト自体が発生しません。

HTTP リクエストが発生しないということは、それを検査する WAF も動作しないため、当然 WAF の料金も発生しない ということになります。

まとめ

  • CloudFront Connection Functions は TLS ハンドシェイク中に実行される。
  • AWS WAF は HTTP リクエストに対して実行される。
  • したがって、Connection Functions で接続を拒否した場合、WAF は動作せず、WAF のリクエスト料金も発生しない。

Connection Functions は、通常の CloudFront Functions とは異なり、より低いレイヤで不要な通信をカットできるため、WAF のコスト削減という観点でも非常に有効な手段と言えそうです。

同じ疑問を持たれた方の参考になれば幸いです。


(参考リンク)

山本 哲也 (記事一覧)

多分インフラエンジニアです。データ分析に興味あります。

山を走るのが趣味です。今年は 100 マイルレース完走します。