CloudFront/ALB構成でユーザーをIP制限する方法

目次
まずはじめに
実際に顧客要望でWebサーバの検証環境を作った場合に、AWS側で許可されたIPアドレスのみアクセス制限ができないかという要望があったので、解決した方法をご紹介したいと思います。
構成図
よくある構成ではありますが、以下の要望及び構成になります。
ユーザー⇔CloudFront⇔ALB⇔EC2(Web)

要件
- テストユーザーはHTTPS通信でWeb通信を行う。
- 本番同等の構成でテストを行う。
- EC2の台数はコストを抑えたいので1台構成とする。
- テストユーザーのグローバルIPアドレスのみEC2をWeb通信を許可する。
- 第三者とテストユーザーは直接EC2へWeb通信を許可しない。
- WAFは本番と同じWebACLを使用してテストも本番同等に実施したい。
調査と結果
- WAFはホワイトリストにテストユーザーのIPアドレスを登録するとWAF素通りとなりWAFのテストができない。
- CloudFrontにIP制限の機能はないので他のAWSリソースで実施する必要がある。
- ALBのSGで制限ができないか? → clientip=CloudFrontのIPで判定するため実装不可であった。
- EC2のSGで制限ができないか? → clientip=ALBのIPで判定するため実装不可であった。
解決方法
ALBのリスナールールで以下の条件で振り分けができます。
●優先度1
- HTTPヘッダー(値) :X-Forwarded-For = 許可したいIPアドレス
- ターゲットグループ:検証用のEC2
●デフォルト
固定レスポンスを返す
- レスポンスコード: 任意のコード
- レスポンス本文:任意の文章
- レスポンスのコンテンツタイプ: 任意のタイプ

仕組み
X-Forwarded-For (XFF) は、 プロキシやロードバランサーを経由したHTTP通信において、本当の接続元クライアントIPアドレスをWebサーバーに伝えるためのHTTPヘッダーフィールド です。実はCloudFrontの仕様にデフォルトで含まれています。公式ドキュメントにも記載がありますので良かったらご参考ください。
カスタムオリジンの場合のリクエストおよびレスポンスの動作 - Amazon CloudFront

動作テスト
●テストユーザー以外のIPアドレスでアクセスしてみた
ALBで設定した例外処理が正しく動作しています。

●テストユーザーのIPアドレスでアクセスしてみた
OKのみ表示されるようにEC2側で設定していますが正しく表示されています。

注意点
X-Forwarded-For (XFF)を利用する際は、プロキシーサーバやVPNなど踏み台を利用していると、
X-Forwarded-For (XFF)のルールの条件としてIPアドレスの設定内容に注意する必要があります。
実際にテストユーザーのIPアドレスではなく、X-Forwarded-For (XFF)にはプロキシーサーバやVPNのIPアドレスがヘッダーに記録されることになります。
テスト環境を考慮したうえでご利用ください。
総括
いかがでしたでしょうか?
実際に顧客要望を解決する際、弊社の検証環境で実装検証してみてみました。
その後に顧客に提案して顧客環境に実装してみましたがうまくいきましたので良かったと言えます。
もしAWS上でお困り事がありましたらお気軽にお問い合わせいただければ幸いです。

元記事発行日: 2026年02月25日、最終更新日: 2026年02月12日














