はじめに

Web サービスを運営するうえで、特定の地域からのアクセスを制限したり、特定の地域のみにアクセスを許可したいというニーズは少なくありません。
AWS では、CloudFront と AWS WAF という2つのサービスに地理的制限機能がありますが、仕様は若干異なります。
例えば以下のような構成の場合、CloudFront と WAF、どちらで地理的制限を設定するのが適切なのでしょうか?


この記事では、リクエストの評価順序や各機能の特徴、地理的制限を使う上での考慮事項についてまとめます。

リクエスト評価順序

AWS WAF の FAQ によると、

基礎となるサービスがウェブサイトへのリクエストを受け取ると、ルールに対して検査するためにそれらのリクエストを AWS WAF へ転送します。リクエストがルールで定義された条件を満たすと、AWS WAF は基礎となるサービスに対し、定義したアクションに基づいてリクエストのブロックまたは許可のいずれかを指示します。

ということで、リクエストはまず CloudFront に届き、そこから WAF に転送されます。

WAF の地理的一致ルールステートメントのドキュメントによると、

CloudFront ディストリビューションでは、CloudFront の地域制限機能を使用する場合、ブロックされたリクエストは AWS WAFに転送されないことに注意してください。許可されたリクエストは に転送されます

とあり、CloudFront の地理的制限でブロックされたリクエストは AWS WAF には転送されないことがわかります。

まとめると、CloudFront の地理的制限と WAF のルールの評価順序は下の図のようになります。

  1. CloudFront に届いたリクエストについて、地理的制限の設定によりアクセス可否判定が行われる。
  2. アクセスが許可された場合、リクエストは WAF に転送される。
  3. WAF のルールでリクエストが評価される。
  4. WAF による評価結果が CloudFront に送信される。
  5. WAF で許可された場合、Origin にリクエストが転送される。

CloudFront の地理的制限

ディストリビューション毎の設定で、Allowlist または Blocklist に国 (複数可) を登録してアクセス制御ができます。
Allowlist を利用した際は指定国からのアクセスを許可し、それ以外の国からのアクセスはブロック、Blocklist を利用した際は指定国からのアクセスはブロックし、それ以外の国からのアクセスは許可する動きになります。

公式ドキュメントの地理的制限のページによると、

CloudFront は、サードパーティーのデータベースを使用して、ユーザーがいる場所を判別します。IP アドレスと国とのマッピングの正確さは、リージョンによって異なります。最近のテストによれば、全体的な正確性は 99.8% です。CloudFront がユーザーの場所を特定できない場合、ユーザーがリクエストしたコンテンツは CloudFront から供給されます。

とあります。

更に、別のドキュメントによると、CloudFront が使用しているサードパーティーのデータベースは MaxMind GeoIP databases とあります。

CloudFront determines the location of your users using MaxMind GeoIP databases.

正確性は 100% ではないというのが明記されています。
また、国を特定出来ない場合はコンテンツを提供する (リクエストをブロックしない) という仕様です。

AWS WAF の地理的制限

国制限より更に範囲を絞り込んだ地域制限が可能なほか、地理的条件の条件も組み合わせた判定が可能です。
CloudFront と同様に MaxMind GeoIP を使用しているとの記載があります。

https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-geo-match.html

WAF の FAQ にも、正確性は 100% ではないというのが明記されています。

IP アドレスと国ルックアップデータベースの対応精度はリージョンによって異なります。最近のテストによると、IP アドレスと国の対応の全体的精度は 99.8% です。

CloudFront と異なり、WAF のルールで特定国以外はアクセスをブロックするようなルールを設定した場合は、国を特定出来ない場合はアクセスをブロックできます。
また、国判定に使う IP アドレスとして、X-Forwarded-For などのヘッダーの値を参照することも可能です。

地理的制限は完璧ではない

CloudFront と WAF のドキュメント、GeoIP 自体のドキュメントにも記載があるように、GeoIP Database は 100% の精度をもつものではありません。
また、MaxMind 社のブログにもあるように、VPN などのプロキシによってユーザーの所在地とは異なる国からのアクセスと判定されることもあります。

IPと国の対応が更新されることも珍しくありません。MaxMind GeoIP database の更新に合わせて AWS 側の GeoIP database も更新されていると思われますが、AWS 側の更新頻度は公開されていません。
CloudFront と WAF で国判定結果が異なるという事象もみられました。

CloudFront と WAF の地理的制限の使い分け

基本的には WAF で地理的制限を行うことをおすすめします。

Web アプリをインターネット公開する場合、アプリケーション脆弱性への攻撃対策として WAF を導入することを推奨します。それに加えて地理的制限を行う場合に、CloudFront と WAF の二箇所でアクセス制御を行ってしまうと、意図しないブロックなどが発生した際にCloudFront と WAF の両方の設定やログなどを確認する必要があり、調査が煩雑になるリスクがあります。

WAF を使うと料金が高くなるのでは?

AWS WAF にはもちろん利用料金がかかります。
ただ、2024年10月に Amazon CloudFront で、AWS WAF によってブロックされたリクエストが課金対象外に というアップデートがありました。

2024 年 10 月 25 日より、AWS WAF でブロックされたすべての CloudFront リクエストが無料になります。この変更により、CloudFront では、AWS WAF でブロックされたリクエストに対するリクエスト料金やデータ転送料金が発生しなくなります。

CloudFront と WAF のリクエスト毎の料金を比べてみると、 WAF の方が安価です。
2025年3月現在の料金で比較すると、以下のようになっています。

CloudFront (日本、HTTPS リクエスト、無料利用枠を超えた分)
0.0120 USD/1 万件のHTTP メソッドのリクエスト
(= 1.2 USD/100 万件)

WAF
0.60 USD/100 万件のリクエスト

各種割引を考慮せずに定価で試算したところ、CloudFront 無料利用枠を超えるリクエストがあり、WAF でブロックされる割合が高いほど、CloudFront の地理的制限より WAF のルールを使用したほうが料金面でお得になりそうなことが分かりました。
なお、CloudFront にも WAF にも、リクエスト数以外の課金要素はあるため、正確な料金につ
いては公式の料金表や Calculator でご確認ください。

https://aws.amazon.com/jp/cloudfront/pricing/
https://aws.amazon.com/jp/waf/pricing/

WAF が不要なケース

CloudFront + S3 で静的コンテンツの読み取りのみ行われる環境など、攻撃によるリスクが少なく、WAF による防御が不要な環境であれば、CloudFront の地理的制限で十分なケースもあるかもしれません。

おわりに

今回は、Amazon CloudFrontとAWS WAFの地理的制限機能の使い分けについて解説しました。
それぞれの機能の特徴やリクエスト評価順序を理解することで、より適切なアクセス制限の設定が可能になります。

ただし、地理的制限は100%の精度を持つものではなく、IPアドレスと国との対応は常に変動する可能性があることには注意が必要です。