メニュー
AWS Lambda
開発者ガイド

AWS Lambda@Edge (プレビュー)

Lambda@Edge (プレビュー) では、AWS Lambda サーバーレスプログラミングモデルを使用して、サーバーのプロビジョニングや管理をすることなく、CloudFront イベントに応答して AWS Edge ロケーションで Lambda 関数を実行できます。Lambda@Edge 以前は、CloudFront を使用してページを比較的速く配信することができましたが、カスタマイズした処理では集中型サーバーのリソースを計算するためにリクエストを転送する必要がありました。これは、エンドユーザーのエクスペリエンスを低下させます。CloudFront イベントへの応答に Lambda@Edge を使用して、AWS のエッジロケーションで実行することにより、ネットワークレイテンシーが減少し、CloudFront を通じて配信されるコンテンツをカスタマイズすることができます。

Node.js で記述された関数が、エッジロケーションへデプロイ可能です。Lambda@Edge を使用すれば、以下を含むソリューションのセットがほぼ無制限で入手可能です。

  • A/B テスト用に、異なるバージョンのサイトに URL を書き換えるために Cookie を検査する Lambda 関数を記述します。

  • ユーザーエージェントヘッダーに基づいて異なるオブジェクトをユーザーに送信します (たとえば、デバイスに基づいて異なる解像度のイメージをユーザーに送信する)。

  • ヘッダーまたは認証トークンを検査し、対応するヘッダーを挿入して、リクエストをオリジンに転送する前にアクセス制御を有効にします。

  • ヘッダーの追加、削除、変更、および URL パスの書き換えを行い、キャッシュの異なるオブジェクトにユーザーをダイレクトします。

  • 未認証ユーザーをログインページにリダイレクトしたり、エッジから直に静的ウェブページを作成して配信したりといったことを行う新しい HTTP レスポンスを生成します。詳細については、HTTP レスポンスの生成を参照してください。

ランタイム (nodejs4.3-edge) は AWS Lambda (nodejs4.3) でサポートされる標準ノード環境と同じですが、いくつかの追加制限があります。例えば、組み込みライブラリを使用できません。Lambda 関数を使用して、CloudFront リクエストで 4 種類のトリガーポイントに応答できます:

  • リクエストが最初にビューアから届いたとき (ビューアリクエスト)。

  • Lambda 関数がオリジン (オリジンの応答) からのレスポンスを受け取るとき。

  • Lambda 関数がリクエストをオリジン (オリジンのリクエスト) に転送するとき。

  • Lambda 関数がエンドビューア (ビューアの応答) に対応する前。

Lambda@Edge で CloudFront をセットアップする詳細については、Lambda@Edge で CloudFront を使用するを参照してください。

仕組み

AWS Edge のロケーションで実行される決定を識別した後は (その決定に必要なすべての情報が関数とリクエスト/レスポンス自体で利用可能な場合)、まずはそのロジックが当てはまるキャッシュの動作とそのリクエストフローの時点を識別します (ビューアのリクエスト、オリジンのリクエスト、オリジンの応答、またはビューアの応答)。

次に、そのロジックをカプセル化するために Lambda 関数を作成します。Lambda@Edge で実行する関数は nodejs4.3 で書き込まれますが、Lambda 関数のランタイムを標準の nodejs4.3 として選択する代わりに、nodejs4.3-edge を選択する必要があります。次に、CloudFront API オペレーションまたは AWSLambda コンソールを使用して、適切なイベント (ビューアリクエストなど) を、Lambda 関数への特定の CloudFront ディストリビューション用に関連付けます。これは、他のすべてのイベントソースと同じモデルです。— たとえば、Amazon S3 イベントの Lambda 関数をトリガーする場合は、特定のバケットの Amazon S3 PUT のような特定のイベントを関連付けます。保存されると、次回ディストリビューションに適用可能なリクエストが行われると、その関数はCloudFront エッジに反映され、必要に応じてスケーリングされ、実行されます。

Lambda@Edge 用の関数を認証する

Lambda@ Edge で Node.js を使用するためのプログラミングモデルは、リージョンで Lambda を使用するプログラミングモデルと同じです。詳細については、「プログラミングモデル (Node.js)」を参照してください。また、サードパーティパッケージを含めることができます。ただし、リクエストイベントに応答するときは、CloudFront がリクエストを変更できるようにコールバックの一部としてリクエストオブジェクトを返す必要があります。応答イベント への応答中にも上記が適用されます。応答オブジェクトが返ってきます。

Copy
exports.origin_response_handler = function(event, context, callback) { var headers = event.Records[0].cf.response.headers; for (var header in headers) { /* your custom header logic */; } callback(null, event.Records[0].cf.response); }
Copy
exports.origin_request_handler = function(event, context, callback) { var request = event.Records[0].cf.request; request.uri = /* your custom uri logic */; var headers = request.headers; for (var header in headers) { /* your custom header logic */; } callback(null , event.Records[0].cf.request); }

注記

Lambda@Edge 関数にはローカルファイルシステムに書き込むための書き込みアクセス権を持っていないため、外部サービスの遠隔ネットワーク呼び出しを実行できません。

アクセス許可

AWS CLI を使用する場合は、Lambda@Edge には追加のアクセス許可が必要です。以下に示すように、リソースのポリシーに次のプリンシパルを追加する必要があります:

Copy
aws lambda add-permission --function-name arn --statement-id statement-id --action lambda:GetFunction --principal edgelambda.amazonaws.com

Lambda コンソールを使用する場合、これらのアクセス許可は自動的に追加されます。

テストおよびデバッグ

Lambda@Edge 機能は、リクエストイベントまたは応答イベント後にモデル化されるテストイベントで、Lambda コンソール上でテストすることができます。サンプルイベントについては、Lambda@Edge のイベント構造 を参照してください。ただし、コンソールでのテストではロジックの検証のみが行われ、Lambda@Edge に固有のサービス制限は適用されません。これは、関数が AWS Edge にデプロイされている場合に発生します。リージョンのテスト中に動作の不一致を避けるには、関数が (AWS SDK 経由またはダイレクト http / https リクエストを介した) リモート呼び出しを行わないこと、または環境変数を使用することを確認し、128 MB と 1 秒間の時間を選択して最終的なエッジデプロイを概算するように関数を構成します。プレビュー中の実際の制限時間が 50ms であることに注意してください。詳細については、「Lambda@Edge の制限」を参照してください。Lambda@Edge で実行される Lambda 関数に、CloudWatch Logs に書き込まれるログ記録ステートメントを作成できます。詳細については、ログのプログラミングモデルを参照してください。

シンプルなセットアップ

Lambda コンソール内:

  1. [cloudfront-ab-test] 設計図を選択します。

  2. [ Triggers] で、CloudFront ディストリビューション、キャッシュ動作、およびイベントタイプを選択します。

    • サービスリストから [CloudFront] を選択します。

    • distribution を選択します。

    • cache behavior identified by the URL pattern を選択します。

      Lambda@Edge で、キャッシュ動作レベルで関数を関連付けます。異なるキャッシングポリシー (オブジェクトをキャッシュする時間、キャッシュキーに含めるヘッダー、コンテンツのオリジン) を指定するには、次のオプションがあります。

      • *.jpg

      • *.php

      • * (default)

    • [CloudFront] イベントタイプを選択します。

  3. Edge-Node.js 4.3 を関数のランタイムに選択します。 現在、Edge-Node.js 4.3 は Lambda@Edge で実行される関数でサポートされている唯一のランタイムです。

  4. Create function を選択します。指定した CloudFront ディストリビューションがリクエストを受け取ると、関数はエッジロケーションに反映し、関数はすべての関連イベントにトリガーを開始します。

注記

Lambda@Edge がエッジロケーションに関数を反映するようにするには、特殊なアクセス権限を追加する必要があることに注意してください。コンソールを使用すると、これらは自動的に追加されます。API または AWS CLI を使用して関数を作成する場合は、アクセス許可 を参照してください。

Lambda@Edge の制限

実行環境の制約があるため、Lambda@Edge にはデフォルトの Lambda 制限以上の追加の制限があります。エッジロケーションで実行される関数はリージョンの同時制限に対してはカウントされません。詳細については、「AWS Lambda の制限」を参照してください。

項目 デフォルトの制限
最大メモリ設定 128 MB
最大期間 50ms
デプロイパッケージ (非圧縮 zip/jar サイズ) に圧縮できるコード/依存関係のサイズ 1 MB
最大グローバル TPS 100