こんにちは!
サーバーレスの構成の場合に、Basic 認証の実現方法は悩みどころだと思います。
EC2 インスタンスを立てていれば、Apache の httpd.conf などで簡単に実現できるところですが、サーバーレスの構成の場合は基本的にウェブサーバーのモジュールを使用できません。(ECS でしたら Docker コンテナーで Apache を制御して実現できそうですが)
本記事では、JavaScript のソースコードを交え実装方法をご紹介いたします。
本記事では、CloudFront と LambdaEdge を使用してBasic 認証を実現する方法をご紹介します。
CloudFront を導入することで下記のような恩恵を受けることができます。まだ導入したことがないという方は、ぜひこの機会に導入を検討しましょう。
CloudFront の魅力はまだまだありますが、そろそろ本題に移ろうと思います😎
まず、下記のソースコードを NodeJs 18.x のランタイムを持つ Lambda 関数へデプロイします。注意点としては下記です。
'use strict';
export const handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const authUser = 'username'; // Basic認証のユーザー名
const authPass = 'password'; // Basic認証のパスワード
const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64');
if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
const body = 'Unauthorized';
const response = {
status: '401',
statusDescription: 'Unauthorized',
body: body,
headers: {
'www-authenticate': [{key: 'WWW-Authenticate', value: 'Basic'}]
},
};
callback(null, response);
}
callback(null, request);
}
Lambda 関数の構築が終わったら、次は構築した Lambda 関数ををCloudFront の Viewer Request(Lambda@Edge)へデプロイします。これで Basic 認証の実装は完了です。
指定の CloudFront の Behavior の設定を確認しましょう。先ほどデプロイしたLambda@Edge の ARN が Viewer Request へ設定されているはずです。
Basic 認証などの汎用的な処理は、1 つの関数のみ実装し使いまわしたいですよね。実現方法は至ってシンプルです。
補足として、Lambda 関数のコンソールで 1 度のデプロイで指定できる CloudFront は 1 つのみです。そのため、私たちは ARN をコピーしてCloudFront へ貼り付ける方法が楽ではないかと感じますが、お好きな方で対応ください。(CloudFormation でデプロイを自動化することも可能ですので合わせて検討ください)
Lambda@Edge は、CloudFront の Edge ロケーションに最も近い場所で実行されるので、ちょっとした処理を加えるなら手軽でかつパフォーマンスに優れている手法ではと感じます。(適宜 Lambda のスペックを下げてコスト節約は必ずしておきましょう)
他にもまだまだ活用方法ありますが、他の記事で紹介したいと思います!
サーバーレス開発に関してお悩みの方は、気軽にご相談ください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎