この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!コンサル部の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のDistribution、Event Type、Cache behaviorを選択し、Add associationボタンをクリックします。
上記が成功すれば、画面下部に関連付けたCloudFrontが表示されます。
Functions画面に戻り、StatusがDeployed
になれば完了です。
3. 結果確認
許可したIPアドレスからアクセスした場合は、ブラウザにWebコンテンツが表示されます。
今回はシンプルにtest
とだけ表示されるHTMLを作成しました。
一方、許可していないIPアドレスからアクセスした場合は、HTTP ERROR 403
の画面が表示されました。
まとめ
既にCloudFrontの環境がある場合は、AWSマネージメントコンソールから簡単にIP制限を設定することができました。
CloudFront Functionsの1ヶ月のリクエスト料金は1,000,000 件あたり 0.10 USDです。
リーズナブルな価格で実装可能なため、ちょっとしたIP制限が必要な場合に手軽に利用できそうですね。
この記事が、どなたかのお役に立てば幸いです。それでは!