AWS CloudFront Functions で IP 制限をかけてみた

Amazon CloudFront + Amazon Simple Storage Service(Amazon S3)による静的ウェブサイトを運用するケースは多いですが、社内利用用途などでIP制限(アクセス制限)をかけたい場合は、CloudFront Functions を使うことで簡単に実現できます。
以下が構成図となります。

Amazon Elastic Compute Cloud(Amazon EC2)の場合はセキュリティグループによるIP制限が可能ですが、運用コストが上がってしまいます。
また、CloudFront に AWS WAF を導入する方法も取れますが、ランニングコストが上がってしまいます。
社内利用等であれば特に運用コスト・ランニングコストを下げたいと思いますので、是非CloudFront Functions で低コストかつ簡単に実現してみましょう。
CloudFront Functions は、CloudFront へのアクセス時に軽量な処理を実行できる AWS の機能です。リクエスト内容を判定し、IP アドレスによるアクセス制限や URL の書き換え、HTTP ヘッダーの操作などを高速に行えます。
目次
検証環境準備
検証環境として、CloudFront+S3 の構成をまずは準備します。
S3 バケットの作成
任意のバケット名を入力し作成します。
その他の設定はデフォルトのままとします。

S3 のバケットは公開したくありませんので、CloudFront から OAC(オリジン・アクセス・コントロール)で設定します。
よって「パブリックアクセスをすべてブロック」の状態で S3 バケットを作成します。
S3 バケットが作成されましたら、動作検証用の index.html ファイルをアップロードします。index.html の中はテキストのみで問題ありません。

CloudFront ディストリビューションの作成
オリジンタイプは S3 を選択し、オリジンは先ほど作成した S3 バケットを選択します。

OAC でアクセスするために、「Allow private S3 bucket access to CloudFront」にはチェックを入れた状態とします。
なお、OAC で CloudFront ディストリビューションを作成した場合、自動で S3 のバケットポリシーが設定されます。以前は手動で設定する必要があったため、便利になりました。

CloudFront ディストリビューションが作成されましたら、
「https://CloudFrontディストリビューションドメイン名/index.html」
へアクセスし、先ほど S3 バケットにアップロードした index.html のページが表示されることを確認します。

ここまでで CloudFront+S3 の構成準備は完了となります。
※この時点ではまだ IP 制限をかけていないため、誰でもアクセス可能となります。
CloudFront Functions による IP 制限の適用
次に、CloudFront Functions による IP 制限を適用します。
既に作成済みの CloudFront ディストリビューションに対して、Functions(関数)を適用するイメージとなります。
CloudFront Functions の作成・適用
左ペインから「関数」をクリックします。

「関数を作成」をクリックします。

関数名を入力し、「関数を作成」をクリックします。

関数コードの画面が表示されます。ここで目的の関数を入力します。
デフォルトで入っているものは上書きして問題ありません。
※以下の画面はデフォルトで表示されるものです。実際にはここを上書きします。

実際に適用する関数は以下です。
"xxx.xxx.xxx.xxx"、"yyy.yyy.yyy.yyy" の部分にアクセスを許可したい IP アドレスを記載します。複数記載することも可能です。
function handler(event) {
var request = event.request;
var clientIP = event.viewer.ip;
var allowedIPs = [
"xxx.xxx.xxx.xxx",
"yyy.yyy.yyy.yyy"
];
if (allowedIPs.indexOf(clientIP) !== -1) {
return request;
}
return {
statusCode: 403,
statusDescription: "Forbidden"
};
}
関数の挙動としては以下になります。
- 許可 IP からのアクセス:そのままサイトを表示する
- 許可 IP 以外からのアクセス:ステータスコード403を返す
それでは実際に適用してみましょう。上記のコードをそのままコピーし(IP アドレスは正しいものを事前に記載してください)、先ほどの関数コード画面にそのまま貼り付けます。
貼り付けたら「変更を保存」をクリックします。

保存しただけでは、まだ CloudFront ディストリビューションに関数は適用されていません。保存後は「発行」タブを選択し、「関数を実行」をクリックします。

発行タブの横にあった「Unpublished」の文字が消え、新たに「関連付けられているディストリビューション」の項目が表示されます。「関連付けを追加」をクリックします。

関連付けのポップアップが表示されます。

- ディストリビューション:今回作成した CloudFront ディストリビューション
- イベントタイプ:Viewer request
- キャッシュビヘイビア:Default(*)
をそれぞれ選択し、「関連付けを追加」をクリックします。
「関連付けられているディストリビューション」に関連付けした内容が表示されれば設定は完了となります。

動作確認
「https://CloudFrontディストリビューションドメイン名/index.html」へアクセスして確認します。
許可した IP からのアクセスで正しく表示されます

許可していない IP からのアクセスでエラー(アクセス拒否)となります

CloudFront Functions QA
Q. IP 制限を AWS WAF や EC2 のセキュリティグループで行う場合との違いは?
A. AWS WAF は、Web サイトや Web アプリケーションをさまざまな攻撃から保護するための Web アプリケーションファイアウォールです。IP 制限だけでなく、SQL インジェクションやクロスサイトスクリプティング(XSS)などへの対策も可能ですが、高機能な分、利用料金が発生します。
一般公開している Web サイトのセキュリティ対策として AWS WAF を導入するケースは多いですが、今回のように「特定の拠点 IPからのみアクセスを許可する」といったシンプルな要件であれば、CloudFront Functions で比較的手軽に実装できます。
一方、EC2 を利用する場合はセキュリティグループによる IP 制限が可能ですが、OS やWeb サーバーなどの管理・運用が必要になります。ただし、EC2 では動的コンテンツも扱えるため、Web サイトの要件に応じて適切な構成を選択することが重要です。
Q. 複数の CloudFront Functions を作成・適用することは可能?
A. 複数の CloudFront Functions を作成すること自体は可能です。
ただし、1つの CloudFront キャッシュビヘイビアに対して、Viewer Request、Viewer Response の各イベントタイプに関連付けられる CloudFront Function はそれぞれ1つまでです。
そのため、例えば Viewer Request で今回紹介した IP 制限に加えて、別の処理も実装したい場合は、基本的に1つの関数内に処理をまとめる必要があります。
Q. 許可する IP アドレスが変わった場合はどうすればいい?
A. CloudFront Function のコード内に記載している許可 IP アドレスを変更し、関数を再発行(Publish)することで対応できます。
例えば、事務所のインターネット回線変更などによってグローバル IP アドレスが変更された場合は、新しい IP アドレスに書き換えて再発行します。
そのため、アクセス元として利用する回線は、固定グローバル IP アドレスを利用することをおすすめします。
Q. IPv6 アドレスからのアクセスも制限できる?
A. 可能です。CloudFront Functions では、アクセス元の IP アドレスを取得できるため、IPv4 だけでなく IPv6 アドレスについても判定できます。
ただし、IPv6 を利用する環境では IPv6アドレスも許可リストに含める必要があります。IPv4 だけを許可していると、同じ拠点からのアクセスでも接続環境によって403エラーになる可能性があるため注意が必要です。
CloudFront Functions(IP 制限)まとめ
CloudFront Functions を使用することで容易に IP 制限(アクセス制限)を実現できます。
今回は IP アドレスでのアクセス制限について紹介しましたが、他にも「Cookie 認証によるアクセス制限」「Basic 認証によるアクセス制限」も CloudFront Functions で実現可能です。
CloudFront+S3 による静的ウェブサイトは、コンテンツ自体は動的に対応しておらず静的のみとなりますが、前段に CloudFront を利用することで CloudFront 側では一部動的な制御が可能となります。要件に合わせて是非試してみてください。

元記事発行日: 2026年09月07日、最終更新日: 2026年08月25日














