CloudFrontで特定のIP以外はリダイレクトさせる

Y
2023-07-20
2023-07-20

いくつかのサイトで特定のIPを許可するといった記事は見かけますが、
CloudFrontを利用している環境で
一時的に特定のIPのみ該当ページを表示させて、
その他のIPはリダイレクトさせたいといったケースがありました。
「https://example.com/example-directory」へアクセスした場合、
特定のIPは許可させる、その他のIPは「https://example.com/」へリダイレクトといったものです。

あまりないケースではあると思いますが備忘録として残しておきます。


前提条件として、
EC2とCloudFrontは構築済みで、CloudFront経由でEC2へアクセスできる状態とします。

手順

1.  AWS管理コンソールにログインしCloudFrontの設定項目に移動し、メニュー左の関数をクリックします。

1-Jul-18-2023-01-28-57-3118-PM

2. 関数を作成をクリックします。

2-Jul-18-2023-01-28-57-2888-PM

3. 関数名を入力し関数を作成をクリックします。 ここでは関数名を example-redirect とします。

3-Jul-18-2023-01-28-57-2893-PM
4. 関数コード箇所に下記関数を記載。記載したら変更を保存をクリックします。

4-Jul-18-2023-01-28-57-3991-PM

function handler(event) {
    var request = event.request;
    var clientIP = event.viewer.ip;
    var uri = request.uri;
    // リダイレクト先URLを入力
    var redirectUrl = `https://example.com/`
    // アクセス許可IPを設定
    var IP_WHITE_LIST = [
     'XXX.XXX.XXX.XXX',
    ];
    // クライアントIPがアクセス許可IPに含まれていればtrueを返す
    var isWhiteListIp = IP_WHITE_LIST.includes(clientIP);
    // 「example-directory」ディレクトリへアクセスがあった場合
    //  アクセス許可IPに含まれてるIPからのみ表示させる。
    if (!uri.includes('example-directory')) {
        return request;
    } else {
       if (isWhiteListIp) {
            return request;
        } else {
            var response = {
                statusCode: 302,
                statusDescription: 'Temporary Redirect',
                headers:
                    { "location": { "value": redirectUrl } }
            }
            return response;
        }
    }
}

 

5. 発行タブをクリックし、関数を発行します。

5-Jul-18-2023-01-28-57-3401-PM

6. 関連付けられているディストリビューションの関連付けを追加をクリックします。

6-3

7. 設定値を入力し関連付けを追加をクリックで完了です。
7
ディストリビューション: 対象ディストリビューション
イベントタイプ: Viewer request
キャッシュビヘイビア: Default
※ここではデフォルトのキャッシュビヘイビアを設定しています。

 

下記参考にさせていただいた記事となります。
https://dev.classmethod.jp/articles/cloudfront-functions-ip-control/

終わりに

いかがでしょうか。
今回のような状況はあまりないかもしれませんが、
もし上記のようなケースが出てきた場合、参考になれば幸いです。