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

    注記

    CloudFront 設計図は、米国東部 1 (バージニア北部) のリージョンでのみ使用可能です。

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

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

    名前

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

    ロール

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

    ロール名

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

    ポリシーテンプレート

    関数の基礎として、CloudFront の設計図を選択したため、ポリシーテンプレート基本的な エッジ Lambda のアクセス許可 が自動的に追加されます。このポリシーテンプレートでは、世界中の CloudFront の場所で、Lambda 関数の実行を CloudFront に許可する実行ロールアクセス許可を追加します。詳細については、「Lambda@Edge 用の IAM アクセス権限とロールの設定」を参照してください。

  6. [Create function] を選択します。Lambda により関数が作成されます。次のページで、「おめでとうございます!」成功メッセージボックスが表示されます。

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

    [設定] タブには、名前別に関数のボックスを含む図 (この例では UpdateSecurityHeaders)、関数のトリガー、ログ記録情報の 3 つの主要な領域があります。下部には、メインエリアで選択したボックス — 関数名、トリガー、または Amazon CloudWatch logs に応じて、さまざまなオプションを許可するように変更するセクションもあります。

    さらに、左側には、選択できるトリガータイプのリストがあります。関数の作成時に CloudFront の設計図を選択したため、CloudFront トリガーが自動的に関数に追加されました。

    これで、関数を更新して、セキュリティヘッダーを変更できるため、次のステップでは、コードを実行するための CloudFront トリガーを設定およびデプロイします。

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

    '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); };
  8. 更新されたコードを保存するには、[Save] を選択します。

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

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

関数の CloudFront トリガーを設定するには

  1. CloudFront ボックスを選択してハイライト表示します。

  2. 以下の [トリガーの設定] セクションで、[Deploy to Lambda@Edge] を選択して、トリガーを定義するページを開き、デプロイします。

    
								CloudFront トリガーを設定し、デプロイするオプションを含む Lambda コンソールページ。
  3. [Lambda@Edge へのデプロイ] ページの [CloudFront トリガーの設定] に、次の情報を入力します。

    ディストリビューション

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

    キャッシュ動作

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

    CloudFront イベント

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

    (オプション) ボディを含める

    ビューワーリクエストイベントまたはオリジンリクエストイベントのリクエストボディにアクセスする場合は、このチェックボックスをオンにします。詳細については、「Include Body オプションを選択するリクエストボディへのアクセス」を参照してください。

    
								関数のコードやトリガーを追加できる Lambda コンソールのページ。
  4. [Lambda@Edge へのデプロイを確認] で、このチェックボックスをオンにして、トリガーがデプロイされていることを確認し、AWS のすべての場所で関数を実行します。

  5. Deploy を選択してトリガーを追加し、関数を世界中の AWS の場所にレプリケートします。

  6. 関数がレプリケートするまで待ちます。通常、これには数分かかりますが、最大で 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. 左側のペインで、[ログ] を選択して、ディストリビューションのログを表示します。

詳細については、「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 を選択します。

これで、バケットを削除できます。詳細については、Amazon Simple Storage Service 入門ガイドの「S3 バケットを削除する方法」を参照してください。

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

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

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

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

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

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

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

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

その他のリソース

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