CloudFront FunctionsでIP制限を試してみた

CloudFront FunctionsでサクッとIP制限しませんか?
2021.06.01

こんにちは!コンサル部のinomaso(@inomasosan)です。

CloudFrontで検証期間中はIP制限したい場合ってありますよね。
今回はCloudFront Functionsで単純なIP制限くらいならできるという噂を聞いたので試してみました。

この記事で学べること

  • CloudFront Functions作成方法
  • IP制限のJavaScriptサンプルコード

前提知識

CloudFront Functionsとは

CloudFrontのエッジロケーションで、軽量なJavaScriptを高速かつ安価に実行できるサービスです。
詳細については弊社ブログにまとまっているので、こちらをご参照ください。

CloudFrontのIP制限おさらい

CloudFrontにはセキュリティグループがないため、CloudFront Functions以外だと以下の方法で対応する必要があります。

  • CloudFrontにAWS WAFを紐付け、特定IPの許可ルール作成
  • Lambda@EdgeによるIP制限
  • X-Fowarded-forヘッダーによるアクセス制御

設定方法等については、以下リンク先が参考になるかと思います。

公式ドキュメント確認

CloudFront Functions作成方法は、公式ドキュメントのチュートリアルがありますので、最初にざっと読むのが良いです。
また、コードの記述方法は以下に記載されています。

コード例はありますが、残念なことにIP制限は無かったので、他の例を参考に書くことにしました。

やりたいことのイメージ

以下、AWS News Blogから抜粋した図です。 Introducing CloudFront Functions – Run Your Code at the Edge with Low Latency at Any Scale | AWS News Blog

CloudFront Functionsでやりたいことは、許可するIPからのリクエストだった場合はオリジン側へリクエストを渡し、それ以外の場合はクライアントにHTTPSステータスコード403でレスポンスを返すことです。

やってみる

1. 前提

今回はCloudFront+ALB+EC2が構築済みの環境を使用します。

2. CloudFront Functions設定

CloudFrontのサービス画面を開き、FunctionsからCreate functionボタンをクリックします。

任意の関数名を入力し、Continueボタンをクリックします。

BuildタブのDevelopmentタブにあるコードエディターに、下記サンプルコードを貼り付けた後はIP_WHITE_LISTのアクセス許可するIPを書き換え、Saveボタンをクリックします。

function handler(event) {
    var request = event.request;
    var clientIP = event.viewer.ip;
    // アクセス許可するIPを設定
    var IP_WHITE_LIST = [
     'xxx.xxx.xxx.xxx',
     'xxx.xxx.xxx.xxx',
    ];
    // クライアントIPが、アクセス許可するIPに含まれていればtrueを返す
    var isPermittedIp = IP_WHITE_LIST.includes(clientIP);

    if (isPermittedIp) {
        // trueの場合はオリジン側へリクエストを渡す
        return request;
    } else {
        var response = {
            statusCode: 403,
            statusDescription: 'Forbidden',
        }

        // falseの場合はViewer に対してレスポンスを返す
        return response;
    }
}


Publishタブを選択し、先ほど保存した関数をLiveステージにコピーし公開するためにPublishボタンをクリックします。

Associateタブを選択し、関連付けたいCloudFrontのDistributionEvent TypeCache behaviorを選択し、Add associationボタンをクリックします。

上記が成功すれば、画面下部に関連付けたCloudFrontが表示されます。

Functions画面に戻り、StatusDeployedになれば完了です。

3. 結果確認

許可したIPアドレスからアクセスした場合は、ブラウザにWebコンテンツが表示されます。
今回はシンプルにtestとだけ表示されるHTMLを作成しました。

一方、許可していないIPアドレスからアクセスした場合は、HTTP ERROR 403の画面が表示されました。

まとめ

既にCloudFrontの環境がある場合は、AWSマネージメントコンソールから簡単にIP制限を設定することができました。

CloudFront Functionsの1ヶ月のリクエスト料金は1,000,000 件あたり 0.10 USDです。
リーズナブルな価格で実装可能なため、ちょっとしたIP制限が必要な場合に手軽に利用できそうですね。

この記事が、どなたかのお役に立てば幸いです。それでは!