はじめに
技術一課の山中です。
S3 のコンテンツに対して CloudFront と Lambda@Edge を利用して Basic 認証をかけたいとの要望があったので、検証してみました。
事前準備
S3 バケットの作成
静的コンテンツを配置するための S3 バケットを作成してください。
作成後、配信するコンテンツを配置します。
Serverless Framework のインストール
以下を実行し Serverless Framework をインストールしておいてください。
$ npm install serverless -g
セットアップ
Serverless Framework の設定
今回は以下 のプラグインを利用します。
- GitHub – silvermine/serverless-plugin-cloudfront-lambda-edge: Adds Lambda@Edge support to Serverless
このプラグインを利用することで Serverless Framework で Lambda@Edge をデプロイすることができます。
npm install --save-dev --save-exact @silvermine/serverless-plugin-cloudfront-lambda-edge
具体的な利用方法は、プラグインの README を参照ください。
serverless.yml は以下のように記載しました。
また、 config.yml を作成しバケット名を外出ししています。
s3: bucket_name: your-bucket-name
your-bucket-name
は自身のバケット名に変更してください。
Basic 認証用コード作成
今回この検証を行っていて知ったことは以下です。
やっぱり何事も事前調査は大事ですよね。
- Lambda は US-East-1 に作成する必要がある
- Python がサポートされてない
- nodejs6.10 または nodejs8.10 のみサポート
- 環境変数がサポートされてない
コードは以下の方のものをそのまま使わせていただきました。
これをコピーして auth.js として保存します。
※ authUser
にユーザ名、 authPass
にパスワードを記載します。
デプロイ
準備が終わったので、デプロイします。
$ sls deploy
以下のように表示されるとデプロイ完了です。
Serverless: Checking Stack update progress... ........................ Serverless: Stack update finished... Service Information service: basic-auth-sample stage: dev region: us-east-1 stack: basic-auth-sample-dev resources: 8 api keys: None endpoints: None functions: basic-auther: basic-auth-sample-dev-basic-auther layers: None
試してみる
マネジメントコンソールから作成された CloudFront の URL を確認しアクセスしてみましょう!
想定通り Basic 認証のポップアップが表示されています。
Lambda に設定したユーザ名とパスワードを入力し Sign In ボタンをクリックすると
S3 に保存した HTML ファイルが表示されています!
ちなみに、 Basic 認証画面で Cancel ボタンをクリックすると以下の画面となり、コンテンツが表示されないことがわかります。
おわりに
Basic 認証を必要とする機会はそこまで多くはないと思いますが、 Serverless Framework を利用すると簡単に実現可能ですので、かなり便利ですね!