Amazon CloudFront
開発者ガイド (API バージョン 2016-09-29)

チュートリアル: シンプルな Lambda@Edge 関数の作成

このチュートリアルでは、CloudFront で実行されるサンプル Node.js 関数を作成および追加する支援を行うことで、Lambda@Edge の使用を開始する方法を示します。説明するこの例では、HTTP セキュリティヘッダーをレスポンスに追加します。これにより、ウェブサイトのセキュリティとプライバシーが向上します (ただし、このチュートリアル用のウェブサイトは必要ありません。CloudFront がファイルを取得するときに、レスポンスにセキュリティヘッダーを追加するのみです)。

この例では、Lambda@Edge 関数の作成および設定方法を詳しく見ていきます。同様のステップに従い、お客様独自の Lambda@Edge ソリューションに合わせて同じオプションから選択できます。

ステップ 1: AWS アカウントをサインアップする

まだアマゾン ウェブ サービスにサインアップしていない場合は、https://aws.amazon.com/ からサインアップします。[今すぐ申し込む] を選択し、必須事項を入力します。

ステップ 2: CloudFront ディストリビューションを作成する

Lambda@Edge 関数の例を作成する前に、コンテンツの提供元のオリジンを含む、操作対象の CloudFront 環境が必要です。

CloudFront を初めて利用する場合 CloudFront は、エッジロケーションの世界的ネットワークを経由してコンテンツを配信します。CloudFront で Lambda 関数を設定すると、この関数はビューワーに近いコンテンツをカスタマイズし、パフォーマンスを向上させることができます。CloudFront について精通していない場合は、チュートリアルを完了する前に数分の時間をかけて、短い概要を読みCloudFront がコンテンツをキャッシュして提供する方法について理解してください。

この例では、CloudFront ディストリビューションのオリジンである、Amazon S3 バケットで設定された CloudFront ディストリビューションを作成します。使用する環境が既にある場合、このステップは省略できます。

Amazon S3 オリジンを使用して CloudFront ディストリビューションを作成するには

  1. サンプルコンテンツ用に、イメージファイルなど 1~2 つのファイルで Amazon S3 バケットを作成します。そのためには、コンテンツを Amazon S3 にアップロードするステップに従います。必ず、バケットのオブジェクトへのパブリック読み取りアクセス権を付与するアクセス許可を設定します。

  2. CloudFront ウェブディストリビューションを作成するステップに従って、CloudFront ディストリビューションを作成し、オリジンとして S3 バケットを追加します。ディストリビューションがすでにある場合は、代わりにそのディストリビューションのオリジンとしてバケットを追加できます。

    ヒント

    ディストリビューション ID をメモします。このチュートリアルの後半では、関数の CloudFront トリガーを追加するときに、ドロップダウンリストでディストリビューションの ID を選択する必要があります (例: E653W22221KDDL)。

ステップ 3: 関数を作成して公開する

このステップでは、Lambda 関数を作成し、Lambda コンソールで提供される設計図テンプレートで開始します。関数コードは、CloudFront ディストリビューションでセキュリティヘッダーを更新するコードを追加します。

Lambda または Lambda@Edge を始めて利用する場合 Lambda@Edge では、CloudFront トリガーを使用して Lambda 関数を呼び出すことができます。CloudFront ディストリビューションを Lambda 関数に関連付けると、CloudFront により CloudFront エッジロケーションでリクエストとレスポンスが傍受され、関数が実行されます。Lambda 関数はセキュリティを向上させたり、ビューワーに近い情報をカスタマイズして、パフォーマンスを向上させたりできます。このチュートリアルでは、作成する関数により、CloudFront レスポンスでセキュリティヘッダーを更新します。

Lambda 関数を作成するときに、実行する複数のステップがあります。このチュートリアルでは、設計図テンプレートを関数の基礎として使用し、セキュリティヘッダーを設定するコードで関数を更新します。最後に、関数の新しいバージョンを保存します。これは CloudFront トリガーを関数に追加する前に必要となるステップです。

Lambda 関数を作成するには

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

    重要

    US-East-1 (バージニア北部) リージョンにいることを確認します。Lambda@Edge 関数を作成するには、このリージョンにいる必要があります。

  2. [Create function] を選択します。

  3. [関数の作成] ページで、[設計図] を選択し、CloudFront 設計図をフィルタリングします。検索フィールドに cloudfront と入力して Return を押します。キーワード cloudfront が表示され、CloudFront のタグが付けられたすべての設計図が表示されます。

     Lambda コンソールで CloudFront 設計図をフィルタリングします。
  4. 関数のテンプレートとして使用する [cloudfront-modify-response-header] 設計図を選択します。

  5. 関数の情報を入力します。

    名前

    関数の名前を入力します。

    ロール

    関数のアクセス許可を設定する方法を選択します。使用を開始する最も簡単な方法は、基本的な Lambda@Edge アクセス権限ポリシーテンプレートの使用であるため、このオプションでは、[テンプレートから新しいロールを作成] を選択します。

    ロール名

    ポリシーテンプレートから作成されるロールの名前を入力します。これは、次に [ポリシーテンプレート] で選択します。

    ポリシーテンプレート

    ドロップダウンリストで、[基本的な エッジ Lambda のアクセス権限] を選択します。このテンプレートは、世界中の CloudFront ロケーションで、Lambda 関数の実行を CloudFront に許可する実行ロールアクセス許可を追加します。詳細については、「Lambda@Edge 用の IAM アクセス権限とロールの設定」を参照してください。

     Lambda 関数のポリシーテンプレートを選択します。
  6. [CloudFront トリガー] セクションで、[削除] を選択します。関数を作成してテストした後は、ディストリビューションに関数を関連付け、トリガーを追加して、関数が実行されるようにします。

    たとえば、セキュリティヘッダーを追加するには、CloudFront オリジンレスポンスがあったときに実行するように関数を設定します。トリガーについての詳細は、「Lambda 関数をトリガーできる CloudFront イベント」を参照してください。

     Lambda 関数の作成時に CloudFront トリガーボックスを削除します。
  7. [Create function] を選択します。Lambda により関数が作成されます。次のページで、「おめでとうございます!」成功メッセージボックスが表示されます。次のステップでは関数コードを更新し、CloudFront トリガーを追加します。

     Lambda コンソールでの関数のコード編集と設定のページ。

    [設定] タブには、3 つの主要な領域があります。それらは、名前別に関数を示す図 (たとえばこの例の UpdateSecurityHeaders)、追加したトリガー (この時点ではありません)、およびログ記録情報です。また、選択できるトリガーのタイプのリストがあり、下部には、コードを追加または更新するための [関数コード] セクションがあります。

     Lambda コンソールで関数のコードやトリガーを追加できるページ。
  8. [関数コード] セクションで、テンプレートコードを、オリジンから返されたセキュリティヘッダーを変更する関数に置き換えます。たとえば、以下のようなコードを実行できます。

    'use strict'; exports.handler = (event, context, callback) => { //Get contents of response const response = event.Records[0].cf.response; const headers = response.headers; //Set new headers headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000 ; includeSubdomains; preload'}]; headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}]; headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}]; headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}]; headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}]; headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}]; //Return modified response callback(null, response); };
  9. 更新されたコードを保存するには、[保存] を選択します。

  10. [アクション] ドロップダウンリストで、[新しいバージョンを発行] を選択します。

    Lambda 関数を編集する場合は、$LATEST バージョンを操作します。ただし、$LATEST バージョンの CloudFront トリガーを追加することはできないため、関数の新しい番号付きバージョンを発行してから、トリガーを追加する必要があります。

ステップ 4: 関数を実行する CloudFront トリガーを追加する

これでセキュリティヘッダーを更新する Lambda 関数を作成したので、関数を実行して、ディストリビューションのオリジンから CloudFront が受け取るレスポンスにヘッダーを追加する CloudFront トリガーを作成します。

ヒント

関数の番号付きバージョンを操作していることを確認します。コンソールを離れ、戻ってもう一度関数を開くと、以前に新しいバージョンを発行している場合でも、バージョンは $LATEST になります。トリガーを追加できるバージョンを開くには、次の操作を行います。

  1. [限定条件] を選択します。

  2. [バージョン] タブを選択し、1 など、$LATEST ではないバージョンを選択します。

 Lambda コンソールで関数の番号付きバージョンを選択するドロップダウンオプション。

関数の CloudFront トリガーを作成するには

  1. [トリガーの追加] で、[CloudFront] を選択します。

  2. [トリガーの設定] で以下の情報を入力します。

    配信

    関数に関連付ける CloudFront ディストリビューション ID。ドロップダウンリストで、ディストリビューション ID を選択します。

    キャッシュ動作

    トリガーで使用するキャッシュ動作。この例では、値を * に設定したままにします。これにより、ディストリビューションのデフォルトのキャッシュ動作がすべてのリクエストに適用されます。詳細については、「ディストリビューションを作成または更新する場合に指定する値」トピックの「キャッシュ動作の設定」を参照してください。

    CloudFront イベント

    関数をいつ実行するか指定するトリガー。CloudFront がオリジンからレスポンスを返すたびに、セキュリティヘッダー関数を実行したいと思います。したがって、ドロップダウンリストで [Origin response (オリジンのレスポンス)] を選択します。詳細については、「Lambda@Edge 関数のトリガーの追加」を参照してください。

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

    トリガーを追加し、世界中の AWS ロケーションに関数をレプリケートするには、このチェックボックスをオンにします。

  3. [Add] を選択してから、[Save] を選択します。

     CloudFront トリガーが Lambda コンソールの関数に追加されました。
  4. 関数がレプリケートするまで待ちます。通常、これには数分かかりますが、最大で 15 分かかる場合があります。

    レプリケーションが終了したかどうかを確認するには、CloudFront コンソールに移動し、ディストリビューションを表示します。

    • CloudFront コンソール (https://console.aws.amazon.com/cloudfront/) に移動します。

    ディストリビューションのステータスが [進行中] から [デプロイ済み] に戻ったことを確認します。この場合、関数はレプリケートされたことを意味します。続いて、次のセクションのステップに従って関数が機能することを確認します。

ステップ 5: 関数の実行を確認する

Lambda 関数を作成し、CloudFront ディストリビューションに対してその関数を実行するトリガーを追加したので、予期したとおりに関数が動作することを確認します。この例では、オリジンから返される HTTP ヘッダーを確認し、セキュリティヘッダーが追加されたことを確認します。

Lambda@Edge 関数でセキュリティヘッダーが追加されることを確認するには

  1. ブラウザで、S3 バケット内のファイルの URL を入力します。たとえば、http://d111111abcdef8.cloudfront.net/image.jpg のような URL を使用できます。

    ファイル URL で使用する CloudFront ドメイン名の詳細については、「CloudFront でファイルの URL の形式をカスタマイズする」を参照してください。

  2. ブラウザのウェブ開発者ツールバーを開きます。たとえば、Chrome のブラウザウィンドウで、コンテキスト (右クリック) メニューを開き、[Inspect (調査)] を選択します。

  3. [Network] タブを選択します。

  4. ページを再ロードしてイメージを表示し、左側のペインの HTTP リクエストを選択します。HTTP ヘッダーが別のペインに表示されます。

  5. HTTP ヘッダーのリストを確認し、予期されるセキュリティヘッダーがリストに含まれていることを確認します。たとえば、次のスクリーンショットに示すようなヘッダーが表示されます。

     予想されるセキュリティヘッダーがハイライト表示された HTTP ヘッダーのリスト。

セキュリティヘッダーがヘッダーのリストに含まれていれば、成功です。最初の Lambda@Edge 関数を正常に作成しました。CloudFront がエラーを返す場合や、その他の問題がある場合は、次のステップに進んで問題のトラブルシューティングを行います。

ステップ 6: 問題のトラブルシューティングを行う

CloudFront がエラーを返すか、予期どおりにセキュリティヘッダーを追加しない場合は、CloudWatch ログを調べることで、関数の実行について調査できます。必ず、関数が実行された場所に最も近い AWS ロケーションで保存されたログを使用します。

たとえば、ロンドンからファイルを表示する場合は、CloudWatch コンソールでリージョンを欧州 (ロンドン) に変更してみてください。

Lambda@Edge 関数の CloudWatch ログを調べるには

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

  2. [リージョン] を、関数が実行されているリージョンに変更します。これは、ブラウザでファイルを表示したときに表示されるロケーションです。

  3. 左側のペインで、[ログ] を選択して、ディストリビューションのログを表示します。

詳細については、「CloudWatch を使用した CloudFront アクティビティの監視」を参照してください。

ステップ 7: リソース例をクリーンアップする

このチュートリアルのためだけに、演習用に S3 バケットおよび CloudFront ディストリビューションを作成した場合、割り当てた AWS リソースを必ず削除して、今後料金が発生しないようにしてください。AWS リソースを削除すると、追加したコンテンツは使用できなくなります。

タスク

S3 バケットの削除

S3 バケットを削除する前に、バケットのログ記録が無効であることを確認します。それ以外の場合、削除するバケットへのログの書き込みが AWS によって継続されます。

バケットのログ記録を無効にするには

  1. https://console.aws.amazon.com/s3/ にある Amazon S3 コンソールを開きます。

  2. バケットを選択し、[Properties] を選択します。

  3. [Properties] から [Logging] を選択します。

  4. [Enabled] チェックボックスをオフにします。

  5. [Save] を選択します。

これで、バケットを削除できます。詳細については、「S3 バケットを削除する方法」を参照してください。」 (Amazon Simple Storage Service Console User Guide) を参照してください。

CloudFront ディストリビューションの削除

CloudFront ディストリビューションを削除する前に、ディストリビューションを無効にする必要があります。無効になったディストリビューションは機能しなくなり、料金も発生しません。無効にしたディストリビューションはいつでも有効にすることができます。無効にしたディストリビューションを削除すると、使用できなくなります。

CloudFront ディストリビューションを無効にして削除するには

  1. https://console.aws.amazon.com/cloudfront/ にある、CloudFront コンソールを開きます。

  2. 無効にするディストリビューションを選択してから [Disable] を選択します。

  3. 確認を求められたら、[Yes, Disable] を選択します。

  4. 無効にしたディストリビューションを選択してから [Delete] を選択します。

  5. 確認を求めるメッセージが表示されたら、[Yes, Delete] を選択します。

その他のリソース

Lambda@Edge 関数の動作について基本的な理解を得たので、以下を参照してさらに詳しく学習します。