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

AWS Lambda@Edge

Lambda@Edge では、CloudFront イベントに応答して AWS リージョンと Amazon CloudFront エッジロケーションで Lambda 関数を実行でき、サーバーのプロビジョニングや管理は不要です。Lambda 関数を使用して、次の時点で CloudFront リクエストとレスポンスを変更できます。

  • CloudFront がビューワーからリクエストを受信した後 (ビューワーリクエスト)

  • CloudFront がリクエストをオリジンサーバーに転送する前 (オリジンリクエスト)

  • CloudFront がオリジンからレスポンスを受信した後 (オリジンレスポンス)

  • CloudFront がビューワーにレスポンスを転送する前 (ビューワーレスポンス)

 CloudFront イベントが Lambda 関数をトリガーする方法を示す概念的なグラフィック

オリジンにリクエストを一切送信することなく、ビューワーへのレスポンスを生成することもできます。

Node.js 6.10 で CloudFront 用の Lambda 関数を作成できます。Lambda@Edge を使用すると、さまざまなソリューションを構築できます。次に例を示します。

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

  • リクエストを送信したデバイスに関する情報が含まれている、User-Agent ヘッダーに基づいてユーザーにさまざまなオブジェクトを送信します。たとえば、ユーザーのデバイスに応じて、さまざまな解像度のイメージをユーザーに送信できます。

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

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

  • 未認証ユーザーをログインページにリダイレクトしたり、エッジから直に静的ウェブページを作成して配信したりといったことを行う新しい HTTP レスポンスを生成します。詳細については、Amazon CloudFront 開発者ガイドの「Lambda 関数を使用してビューワーおよびオリジンリクエストへの HTTP レスポンスを生成する」を参照してください。

サンプルコードを含む、Lambda@Edge を使用した CloudFront のセットアップの詳細については、Amazon CloudFront 開発者ガイドの「CloudFront と Lambda@Edge の使用」を参照してください。

Lambda@Edge 用の Lambda 関数を作成する方法

Lambda@Edge 用の Lambda 関数を作成する方法の概要を以下に示します。

  1. Node.js 6.10 を使用して、Lambda 関数のコードを記述します。

  2. AWS Lambda コンソールを使用して、米国東部 (バージニア北部) リージョン で Lambda 関数を作成します (関数をプログラムで作成することもできます。たとえば、次のいずれかの AWS SDK を使用します)。関数を作成するときは、以下の値を指定します。

    • 関数を適用する CloudFront ディストリビューション

    • ディストリビューションのキャッシュ動作

  3. 番号付きバージョンの関数を発行します。

    関数を編集する場合は、米国東部 (バージニア北部) リージョン で編集します。次に、新しい番号付きバージョンを発行します。

  4. 1 つまたは複数の CloudFront イベント (トリガーとも呼ばれる) を指定します。これにより、関数を実行できます。たとえば、CloudFront がビューワーからリクエストを受信したときに関数を実行させるトリガーを作成できます。

    トリガーを作成すると、Lambda は関数を世界中の AWS リージョンと CloudFront エッジロケーションにレプリケートします。レプリカは編集または削除できないことに注意してください。

 CloudFront と統合する Lambda 関数を作成する方法を示す概念的なグラフィック。

Lambda@Edge 用の IAM アクセス権限とロールの設定

Lambda@Edge を設定するには、IAM アクセス権限および IAM 実行ロールが必要です。

Lambda 関数を CloudFront ディストリビューションに関連付けるために必要な IAM アクセス許可

AWS Lambda を使用するために必要な IAM アクセス権限に加え、Lambda 関数を CloudFront ディストリビューションに関連付けるために次の IAM アクセス権限が必要です。

  • lambda:GetFunction

    リソースに対して、次の例に示すように、CloudFront イベントが発生した場合に実行する関数バージョンの ARN を指定します。

    arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2

  • lambda:EnableReplication*

    リソースに対して、次の例に示すように、CloudFront イベントが発生した場合に実行する関数バージョンの ARN を指定します。

    arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2

  • iam:CreateServiceLinkedRole

  • cloudfront:UpdateDistribution または cloudfront:CreateDistribution

    cloudfront:UpdateDistribution を選択してディストリビューションを更新するか、cloudfront:CreateDistribution を選択してディストリビューションを作成します。

詳細については、次のドキュメントを参照してください。

実行ロール

サービスプリンシパル lambda.amazonaws.comedgelambda.amazonaws.com が引き受けることができる IAM ロールを作成する必要があります。このロールは、関数を実行するときに、サービスプリンシパルが引き受けることができます。詳細については、IAM ユーザーガイドのトピック「職務機能の AWS 管理ポリシー」の「ロールの作成とポリシーのアタッチ (コンソール)」を参照してください。

ロールの信頼ポリシーの例を示します。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "edgelambda.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }

実行ロールに付与する必要があるアクセス権限の詳細については、AWS Lambda Developer Guideの「アクセス権限の管理: IAM ロール (実行ロール) を使用する」を参照してください。次の点に注意してください。

  • デフォルトでは、CloudFront イベントが Lambda 関数をトリガーするたびに、データが CloudWatch Logs に書き込まれます。これらのログを使用する場合は、CloudWatch Logs にデータを書き込むためのアクセス権限が実行ロールに必要です。事前定義された AWSLambdaBasicExecutionRole を使用して、実行ロールにアクセス権限を付与できます。

    CloudWatch Logs の詳細については、Amazon CloudFront 開発者ガイドの「Lambda 関数の CloudWatch メトリクスと CloudWatch Logs」を参照してください。

  • S3 バケットからのオブジェクトの読み取りなど、Lambda 関数コードが他の AWS リソースにアクセスする場合、そのオペレーションを実行するためのアクセス権限が実行ロールに必要です。

AWSServiceRoleForLambdaReplicator ロール

トリガーを初めて作成するとき、AWSServiceRoleForLambdaReplicator という名前のロールが自動的に作成され、Lambda@Edge 関数を AWS リージョンにレプリケートできるようになります。このロールは、Lambda@Edge を使用するために必要です。AWSServiceRoleForLambdaReplicator ロールの ARN は次のようになります。

arn:aws:iam::123456789012:role/aws-service-role/replicator.lambda.amazonaws.com/AWSServiceRoleForLambdaReplicator

Lambda@Edge 関数の作成と、CloudFront イベント用のトリガーの作成

CloudFront イベントに基づいて Lambda 関数を実行するよう AWS Lambda をセットアップするには、以下の手順を実行します。

Lambda@Edge 関数と、CloudFront イベント用のトリガーを作成するには

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. 1 つ以上の Lambda 関数がすでにある場合は、[Create a Lambda function] を選択します。

    関数がない場合は、[Get Started Now] を選択します。

  3. ページの上部にあるリージョンのリストで、[米国東部(バージニア北部)] を選択します。

  4. [Select runtime] で [Node.js 6.10] を選択します。

  5. [Filter] で、「cloudfront」と入力します。

  6. 適用可能な設計図を選択します。

  7. [Configure triggers] ページで、オプションで関数にトリガーを追加することもできます。

    重要

    トリガーを追加した場合、関数は AWS リージョンとエッジロケーションへのレプリケーションの終了後に実行を開始し、対応するディストリビューションがデプロイされます。トリガーを追加する前に、関数をテストおよびデバッグすることをお勧めします。詳細については、「テストおよびデバッグ」を参照してください。

    今すぐトリガーを追加しない場合は、次の操作を行います。

    • [Blank function] を選択した場合は、[Next] を選択します。

    • 別の設計図を選択した場合は、[Remove] を選択して、[Next] を選択します。

    今すぐトリガーを追加する場合は、次の操作を行います。

    • [Blank function] を選択した場合は、Lambda アイコンの横にあるチェックボックスをオンにし、[CloudFront] を選択します。次に、以下の値を入力します。

    • いずれかの cloudfront-* 設計図を選択した場合は、次の値を入力します。

    注記

    Lambda 関数を作成するときに、トリガーを 1 つだけ追加できます。後でトリガーを追加できます。

    ディストリビューション ID

    トリガーの追加先となるディストリビューションの ID を選択します。

    キャッシュ動作

    関数を実行するオブジェクトを指定するキャッシュ動作を選択します。

    CloudFront イベント

    関数を実行させる CloudFront イベントを選択します。

    トリガーとレプリケートの有効化

    このチェックボックスをオンにし、AWS Lambda が関数をリージョンに対してグローバルにレプリケートするようにします。

  8. [Next] を選択します。

  9. [Configure function] セクションで、以下の値を指定します。

    名前

    54 文字以内で名前を入力してください。

    説明

    ここで入力した説明が、Lambda コンソールを開いたときに表示される関数のリストに表示されます。

    ランタイム

    [Node.js 6.10] から値を変更することはできません。

  10. [Lambda function code] セクションで、コードを編集またはインポートします。

  11. [Lambda function handler and role] セクションで、以下の値を指定します。

    Handle

    関数の module-name.export.export 値を指定します。

    ロール

    [Create new role from template(s)] を選択します。

    ロール名

    新しいロールの名前を入力します。

    ポリシーテンプレート

    [Basic Edge Lambda permissions] を選択します。

  12. [Tags] セクションで、タグを追加します (該当する場合)。

  13. [Next] を選択します。([Advanced settings] セクションで設定を変更することはできません。)

  14. [Review] ページで、[Create function] を選択します。

  15. 同じ関数のトリガーを追加する場合は、次のドキュメントを参照してください。

Lambda@Edge 関数のトリガーの追加 (AWS Lambda コンソール)

Lambda 関数を作成する場合は、1 つのトリガーのみを指定できます。つまり、CloudFront ディストリビューション、キャッシュ動作、および関数を実行させるイベントの 1 つの組み合わせのみです。Lambda コンソールを使用するか、CloudFront コンソールでディストリビューションを編集して、同じ関数にトリガーを追加できます。

  • Lambda コンソールを使用するには、以下の手順を実行します。この方法は、同じ CloudFront ディストリビューションの関数にトリガーを追加する場合に適しています。

  • CloudFront コンソールを使用するには、Amazon CloudFront 開発者ガイドの「CloudFront イベントのトリガーを Lambda 関数に追加する」を参照してください。この方法は、更新するディストリビューションを見つけやすいため、複数のディストリビューションのトリガーを追加する場合に適しています。同時に他の CloudFront 設定を更新することもできます。

Lambda@Edge 関数にトリガーを追加するには (AWS Lambda コンソール)

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. ページの上部にあるリージョンのリストで、[米国東部(バージニア北部)] を選択します。

  3. [Functions] ページで、トリガーを追加する関数の名前を選択します。

  4. [Qualifiers] を選択し、次に [Versions] タブを選択します。

  5. トリガーを追加するバージョンを選択します。

    重要

    $LATEST バージョンのトリガーを作成することはできず、番号付きバージョンのトリガーを作成する必要があります。

    バージョンを選択すると、ボタンの名前が [Version: $LATEST] または [Version: バージョン番号] に変わります。

  6. [Triggers] タブを選択します。

  7. [Add triggers] を選択します。

  8. [Add trigger] ダイアログボックスでチェックボックスをオンにし、[CloudFront] を選択します。

    注記

    1 つまたは複数のトリガーを作成済みの場合、CloudFront がデフォルトのサービスになります。

  9. Lambda 関数をいつ実行するかを示す、次の値を指定します。

    ディストリビューション ID

    トリガーの追加先となるディストリビューションの ID を選択します。

    キャッシュ動作

    関数を実行するオブジェクトを指定するキャッシュ動作を選択します。

    CloudFront イベント

    関数を実行させる CloudFront イベントを選択します。

    トリガーとレプリケートの有効化

    このチェックボックスをオンにし、AWS Lambda が関数をリージョンに対してグローバルにレプリケートするようにします。

  10. [Submit] を選択します。

    この関数は、更新された CloudFront ディストリビューションがデプロイされたときに、指定された CloudFront イベントのリクエストの処理を開始します。ディストリビューションがデプロイされているかどうかを確認するには、ナビゲーションペインで [Distributions] を選択します。ディストリビューションがデプロイされると、ディストリビューションの [Status] 列の値が、[In Progress] から [Deployed] に変わります。

Lambda@Edge 用の関数を記述する

Lambda@ Edge で Node.js を使用するためのプログラミングモデルは、AWS リージョンで Lambda を使用するプログラミングモデルと同じです。詳細については、「プログラミングモデル (Node.js)」を参照してください。

Lambda@Edge 用の関数の記述の詳細については、Amazon CloudFront 開発者ガイドの「Lambda 関数の要件と制約」を参照してください。

callback パラメーターを含め、該当するオブジェクトを返すことをお勧めします。

例: A/B テスト

次の例では、A/B テストに Lambda@Edge を使用する方法を示しています。

Copy
'use strict'; exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; const headers = request.headers; if (request.uri !== '/experiment-pixel.jpg') { // do not process if this is not an A-B test request callback(null, request); return; } const cookieExperimentA = 'X-Experiment-Name=A'; const cookieExperimentB = 'X-Experiment-Name=B'; const pathExperimentA = '/experiment-group/control-pixel.jpg'; const pathExperimentB = '/experiment-group/treatment-pixel.jpg'; /* * Lambda at the Edge headers are array objects. * * Client may send multiple Cookie headers, i.e.: * > GET /viewerRes/test HTTP/1.1 * > User-Agent: curl/7.18.1 (x86_64-unknown-linux-gnu) libcurl/7.18.1 OpenSSL/1.0.1u zlib/1.2.3 * > Cookie: First=1; Second=2 * > Cookie: ClientCode=abc * > Host: example.com * * You can access the first Cookie header at headers["cookie"][0].value * and the second at headers["cookie"][1].value. * * Header values are not parsed. In the example above, * headers["cookie"][0].value is equal to "First=1; Second=2" */ let experimentUri; if (headers.cookie) { for (let i = 0; i < headers.cookie.length; i++) { if (headers.cookie[i].value.indexOf(cookieExperimentA) >= 0) { console.log('Experiment A cookie found'); experimentUri = pathExperimentA; break; } else if (headers.cookie[i].value.indexOf(cookieExperimentB) >= 0) { console.log('Experiment B cookie found'); experimentUri = pathExperimentB; break; } } } if (!experimentUri) { console.log('Experiment cookie has not been found. Throwing dice...'); if (Math.random() < 0.75) { experimentUri = pathExperimentA; } else { experimentUri = pathExperimentB; } } request.uri = experimentUri; console.log(`Request uri set to "${request.uri}"`); callback(null, request); };

例: HTTP リダイレクト

以下の例では、CloudFront ビューワーリクエストおよびオリジンリクエストイベントに関連付けられた Lambda 関数を使用して HTTP リダイレクトレスポンスを生成する方法を示します。関数をオリジンリクエストに関連付けると、レスポンスがキャッシュされます。

注記

HTTP レスポンスは、ビューワーリクエストおよびオリジンリクエストのイベントに対してのみ生成できます。詳細については、Amazon CloudFront 開発者ガイド の「HTTP レスポンスの生成」を参照してください。

Copy
'use strict'; exports.handler = (event, context, callback) => { /* * Generate HTTP redirect response with 302 status code and Location header. */ const response = { status: '302', statusDescription: 'Found', headers: { location: [{ key: 'Location', value: 'http://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html', }], }, }; callback(null, response); };

Lambda@Edge 用の Lambda 関数の編集

Lambda 関数を編集する場合は、次の点に注意してください。

  • 元のバージョンのラベルは [$LATEST] です。

  • $LATEST バージョンのみを編集できます。

  • $LATEST バージョンを編集するたびに、新しい番号付きバージョンを公開する必要があります。

  • $LATEST のトリガーを作成することはできません。

  • 新しいバージョンの関数を発行する場合、Lambda は以前のバージョンから新しいバージョンにトリガーを自動的にコピーしません。新しいバージョン用のトリガーを再現する必要があります。

  • CloudFront イベントのトリガーを関数に追加する場合、同じディストリビューション、キャッシュ動作、および同じ関数の以前のバージョン用のイベント用のトリガーが既に存在している場合、Lambda は以前のバージョンからトリガーを削除します。

Lambda 関数を編集するには (AWS Lambda コンソール)

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. ページの上部にあるリージョンのリストで、[米国東部(バージニア北部)] を選択します。

  3. 関数のリストで、編集する関数の名前を選択します。

    デフォルトでは、$LATEST バージョンがコンソールに表示されます。以前のバージョンを表示することはできますが ([Qualifiers] を選択します)、編集できるのは $LATEST のみです。

  4. [Code] タブの [Code entry type] で、ブラウザでのコードの編集、.zip ファイルのアップロード、または Amazon S3 からのファイルのアップロードを選択します。

  5. [Save] または [Save and test] を選択します。

  6. [Actions] を選択し、[Publish new version] を選択します。

  7. [Publish new version from $LATEST] ダイアログボックスで、新しいバージョンの説明を入力します。この説明は、自動的に生成されたバージョン番号とともにバージョンのリストに表示されます。

  8. [Publish] を選択します。

    新しいバージョンが自動的に最新バージョンになります。バージョン番号はページの左上隅にある [Version] ボタンに表示されます。

  9. [Triggers] タブを選択します。

  10. [Add trigger] を選択します。

  11. [Add trigger] ダイアログボックスでチェックボックスをオンにし、[CloudFront] を選択します。

    注記

    関数の 1 つまたは複数のトリガーを作成済みの場合、CloudFront がデフォルトのサービスになります。

  12. Lambda 関数をいつ実行するかを示す、次の値を指定します。

    ディストリビューション ID

    トリガーの追加先となるディストリビューションの ID を選択します。

    キャッシュ動作

    関数を実行するオブジェクトを指定するキャッシュ動作を選択します。

    CloudFront イベント

    関数を実行させる CloudFront イベントを選択します。

    トリガーとレプリケートの有効化

    このチェックボックスをオンにし、Lambda が関数をリージョンに対してグローバルにレプリケートするようにします。

  13. [Submit] を選択します。

  14. この関数のトリガーをさらに追加するには、ステップ 10~13 を繰り返します。

テストおよびデバッグ

Lambda@Edge 関数は、CloudFront イベントでモデル化されるテストイベントで、Lambda コンソール上でテストすることができます。ただし、コンソールでのテストではロジックのみを検証し、Lambda@Edge に固有のサービス制限は適用されません。

Lambda@Edge で実行される Lambda 関数に、CloudWatch Logs に書き込まれるログ記録ステートメントを作成できます。詳細については、ログのプログラミングモデルを参照してください。

詳細については、Amazon CloudFront 開発者ガイドの次のトピックを参照してください。

Lambda@Edge の制限

実行環境の制約があるため、Lambda@Edge にはデフォルトの Lambda 制限に加えて追加の制限があります。 詳細については、次のドキュメントを参照してください。

項目 制限
メモリ 128 MB
CloudFront のオリジンリクエストおよびオリジンレスポンスイベントのタイムアウト (関数は S3 バケット、DynamoDB テーブル、AWS リージョンの EC2 インスタンスなどのリソースに対してネットワーク呼び出しを実行できます)。 3 秒
CloudFront ビューワーリクエストおよびビューワーレスポンスイベントのタイムアウト (関数はネットワーク呼び出しを実行できません)。 1 秒
Lambda 関数および組み込みライブラリの最大圧縮サイズ 1 MB