1. 導入:なぜLambda@Edgeで処理を「エッジ」に寄せるのか?
Webアプリケーションのパフォーマンスを決定づける要素の一つが「レイテンシー(遅延)」です。特に認証やリダイレクトといった処理は、ユーザーが最初に体験する部分であり、高速であることが求められます。
従来のアーキテクチャでは、これらの処理をオリジンサーバー(EC2やFargateなど)で行うため、ユーザーからのリクエストが物理的に遠いサーバーまで到達するのを待つ必要がありました。
この記事では、AWSのCloudFrontとLambda@Edgeを組み合わせ、これらの処理をユーザーに最も近い「エッジロケーション」で実行する、サーバーレスな高速実装の方法を徹底的に解説します。
2. 基本理解:CloudFrontとLambda@Edgeの役割
処理をエッジに寄せることのメリットを理解するために、それぞれのサービスがどのような役割を担っているかを確認します。
2.1 CloudFront:コンテンツ配信の最前線
CloudFrontは、AWSが提供する**CDN(Contents Delivery Network)**です。世界中に配置された「エッジロケーション」にコンテンツをキャッシュし、ユーザーに最も近い場所から高速にコンテンツ(静的ファイル、APIレスポンスなど)を配信します。
2.2 Lambda@Edge:エッジロケーションでコードを実行
Lambda@Edgeは、このCloudFrontのエッジロケーションで実行されるサーバーレスなAWS Lambda関数です。
Lambda@Edgeの最大の強みは、リクエストがオリジンサーバーに到達する前、あるいはレスポンスがユーザーに返る直前という、通信経路上の非常に早い段階で任意のコードを実行できる点にあります。
これにより、サーバーレスで超低レイテンシーな処理がグローバルに実現できます。
3. Lambda@Edgeの4つのイベントタイプとユースケース
Lambda@Edgeは、CloudFrontの処理フローにおける4つの異なるタイミングでコードを実行できます。ユースケースに応じて適切なタイミングを選択することが重要です。
| イベントタイプ | 処理のタイミング | 主なユースケース |
| Viewer Request | ユーザーのブラウザからのリクエストを受信した直後。 | 認証、リダイレクト、A/Bテストの振り分け |
| Origin Request | CloudFrontがオリジンサーバーへリクエストを送る直前。 | キャッシュキーの変更、ヘッダー(署名など)の追加 |
| Origin Response | オリジンサーバーからCloudFrontがレスポンスを受け取った直後。 | レスポンス内容の調整、ヘッダーの削除 |
| Viewer Response | CloudFrontがユーザーのブラウザへレスポンスを返す直前。 | Cookieの書き換え、セキュリティヘッダー(HSTSなど)の追加 |
4. 【実践】具体的な実装例:未認証ユーザーのリダイレクト
最も一般的で効果的なユースケースの一つである「未認証ユーザーのログインページへのリダイレクト」を、Lambda@Edgeで実装する手順を解説します。
この処理は、ユーザーがリクエストを送信した直後、オリジンに到達する前に行う必要があるため、Viewer Requestイベントを使用します。
🛠️ 目的:特定パスへのアクセス時に認証をチェック
ユーザーが /admin などの保護されたパスにアクセスした場合、Cookie(セッション情報)をチェックし、認証されていなければ /login にリダイレクトします。
🛠️ Node.js 実装例(Viewer Request)
Lambda@Edgeの関数は、CloudFrontから渡されるイベントオブジェクトを処理します。
JavaScript
'use strict';
exports.handler = async (event) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const host = headers.host[0].value;
// 1. 保護対象のパスかチェック
if (request.uri.startsWith('/admin')) {
// 2. 認証Cookieの存在をチェック (ここでは簡易的なチェック)
const cookie = headers.cookie ? headers.cookie[0].value : '';
if (!cookie.includes('session_token=')) {
// 3. 認証Cookieがない場合はリダイレクトレスポンスを返す
const response = {
status: '302',
statusDescription: 'Found',
headers: {
location: [{
key: 'Location',
value: `https://${host}/login` // ログインページへリダイレクト
}],
},
};
return response;
}
}
// 認証済み、または保護対象外の場合は、そのままリクエストを続行
return request;
};
🛠️ デプロイの注意点
Lambda@Edgeは、必ず**us-east-1(バージニア北部)リージョン**で作成し、CloudFrontのディストリビューションに関連付ける必要があります。
5. まとめと開発者へのメッセージ
Lambda@Edgeを活用することで、従来のサーバーレス構成を一歩進め、「エッジコンピューティング」という考え方を取り入れられます。
- 認証・リダイレクトをエッジで処理することで、ユーザー体験を向上させることができます。
- オリジンサーバーの負荷軽減にも繋がり、よりスケーラブルなWebアプリケーションの構築が可能です。
この記事を参考に、あなたのアプリケーションのパフォーマンス改善に役立ててください。
コメント