Lambda@Edgeで実現!認証・リダイレクトをエッジで処理するサーバーレス実装

インフラ

1. 導入:なぜLambda@Edgeで処理を「エッジ」に寄せるのか?

Webアプリケーションのパフォーマンスを決定づける要素の一つが「レイテンシー(遅延)」です。特に認証やリダイレクトといった処理は、ユーザーが最初に体験する部分であり、高速であることが求められます。

従来のアーキテクチャでは、これらの処理をオリジンサーバー(EC2やFargateなど)で行うため、ユーザーからのリクエストが物理的に遠いサーバーまで到達するのを待つ必要がありました。

この記事では、AWSのCloudFrontLambda@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 RequestCloudFrontオリジンサーバーへリクエストを送る直前。キャッシュキーの変更、ヘッダー(署名など)の追加
Origin ResponseオリジンサーバーからCloudFrontがレスポンスを受け取った直後。レスポンス内容の調整、ヘッダーの削除
Viewer ResponseCloudFrontがユーザーのブラウザへレスポンスを返す直前。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アプリケーションの構築が可能です。

この記事を参考に、あなたのアプリケーションのパフォーマンス改善に役立ててください。

コメント

タイトルとURLをコピーしました