メニュー
Amazon CloudFront
開発者ガイド (API Version 2016-09-29)

Lambda 関数の要件と制限

CloudFront で Lambda 関数を使用する場合の要件と制限については、次のセクションを参照してください。

CloudFront ディストリビューションと関連付け

  • AWS アカウントあたり最大 25 個のディストリビューションで Lambda 関数のトリガー (関連付け) を作成できます。

  • ディストリビューションごとに最大 100 個のトリガー (関連付け) を作成できます。

Lambda 関数の CloudFront トリガー

  • トリガーを追加できるのは番号付きバージョンのみです。$LATEST やエイリアスには追加できません。

  • トリガーを追加できるのは、米国東部(バージニア北部) リージョンの関数のみです。

  • トリガーを追加するには、Lambda 関数に関連付けられている IAM 実行ロールをサービスプリンシパルの lambda.amazonaws.com および edgelambda.amazonaws.com が引き受けられる必要があります。詳細については、『IAM ユーザーガイド』の「Lambda@Edge 用の IAM アクセス権限とロールの設定」を参照してください。

CloudWatch Logs

Amazon CloudWatch Logs の制限の詳細については、『Amazon CloudWatch ユーザーガイド』の「CloudWatch Logs の制限」を参照してください。

ヘッダー

Lambda@Edge でヘッダーを使用する場合は以下の要件に注意してください。

ブラックリストに記載されているヘッダー

ブラックリストに記載されているヘッダーは公開されず、Lambda@Edge 関数で追加することはできません。ブラックリストに記載されているヘッダーを Lambda 関数で追加すると、リクエストが CloudFront の検証に失敗し、ビューワーに HTTP ステータスコード 502 (Bad Gateway) が返されます。

  • Connection

  • Expect

  • Keep-alive

  • Proxy-Authenticate

  • Proxy-Authorization

  • Proxy-Connection

  • Trailer

  • Upgrade

  • X-Accel-Buffering

  • X-Accel-Charset

  • X-Accel-Limit-Rate

  • X-Accel-Redirect

  • X-Amz-Cf-*

  • X-Amzn-*

  • X-Cache

  • X-Edge-*

  • X-Forwarded-Proto

  • X-Real-IP

読み取り専用ヘッダー

読み取り専用ヘッダーは読み取ることができますが、編集することはできません。CloudFront キャッシュロジックへの入力として使用でき、Lambda 関数でヘッダー値を読み取ることはできますが、値を変更することはできません。Lambda 関数で読み取り専用ヘッダーを追加または編集すると、リクエストが CloudFront の検証に失敗し、ビューワーに HTTP ステータスコード 502 (Bad Gateway) が返されます。

CloudFront ビューワーリクエストイベントの読み取り専用ヘッダー

  • Content-Length

  • Host

  • Transfer-Encoding

  • Via

CloudFront オリジンリクエストイベントの読み取り専用ヘッダー

  • Accept-Encoding

  • Content-Length

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Range

  • Transfer-Encoding

  • Via

CloudFront オリジンレスポンスイベントの読み取り専用ヘッダー

  • Content-Encoding

  • Content-Length

  • Transfer-Encoding

  • Via

CloudFront ビューワーレスポンスイベントの読み取り専用ヘッダー

  • Content-Encoding

  • Content-Length

  • Transfer-Encoding

  • Warning

  • Via

CloudFront オリジンリクエストイベントの制限されたヘッダー

デフォルトでは、CloudFront はビューワーリクエストから次のヘッダーを削除します。ヘッダーに基づいてキャッシュするように CloudFront ディストリビューションが設定されている場合のみ、CloudFront オリジンリクエストイベントで、これらのヘッダーを追加または編集できます。これにより、CloudFront はヘッダーを削除する代わりにオリジンに転送します。

Lambda 関数が制限されたヘッダーを追加または変更して、CloudFront ディストリビューションがそのヘッダーに基づいてキャッシュするように設定されていない場合は、リクエストは CloudFront の検証に失敗します。ビューワーに HTTP ステータスコード 502 (Bad Gateway) が返されます。

指定されたヘッダーに基づいてキャッシュするように CloudFront を設定する方法の詳細については、ウェブディストリビューションを作成または更新する場合に指定する値 のトピックの 選択されたリクエストヘッダーに基づいたキャッシュ を参照してください。

  • Accept

  • Accept-Charset

  • Accept-Language

  • Authorization

  • Referer

  • TE

CloudFront-* Headers

Lambda 関数は、以下のヘッダーの読み込み、編集、削除、または追加ができます。

  • CloudFront-Forwarded-Proto

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

  • CloudFront-Viewer-Country

次の点に注意してください。

  • CloudFront でこれらのヘッダーを追加するには、これらのヘッダーに基づいてキャッシュするように CloudFront を設定する必要があります。指定されたヘッダーに基づいてキャッシュするように CloudFront を設定する方法の詳細については、ウェブディストリビューションを作成または更新する場合に指定する値 のトピックの 選択されたリクエストヘッダーに基づいたキャッシュ を参照してください。

  • CloudFront は、ビューワーリクエストイベントの後にヘッダーを追加します。

  • ビューワーがこれらの名前を持つヘッダーを追加する場合、CloudFront はヘッダー値を上書きします。

  • ビューワーイベントでは、 CloudFront-Viewer-Country はブラックリストに載せられています。ブラックリストに記載されているヘッダーは公開されず、Lambda@Edge 関数で追加することはできません。Lambda 関数がブラックリストに記載されているヘッダーを追加すると、リクエストは CloudFront の検証に失敗し、CloudFront は、ビューワーに HTTP ステータスコード 502 (不正なゲートウェイ) を返します。

詳細については、次の例を参照してください。

HTTP Status Codes

オリジンから 400 以上の HTTP ステータスコードが返された場合、オリジンレスポンスイベントおよびビューワーレスポンスイベントに対して Lambda 関数は実行されません。

Lambda 関数の設定と実行環境

  • nodejs6.10 ランタイムプロパティを使用して関数を作成する必要があります。

  • 関数で使用できるメモリは最大 128 MB です。

  • VPC 内のリソースにアクセスするように Lambda 関数を設定することはできません。

  • CloudFront のオリジンリクエストイベントとオリジンレスポンスイベントの最大実行時間のタイムアウトは 3 秒です。

  • CloudFront のビューワーリクエストイベントとビューワーレスポンスイベントの最大実行時間のタイムアウトは 1 秒です。

  • デッドレターキュー (DLQ) はサポートされていません。

  • Lambda 関数および組み込みライブラリの最大圧縮サイズは 1 MB です。

  • 環境変数はサポートされていません。

制限

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

Microsoft Smooth Streaming

Microsoft Smooth Streaming 形式に変換したメディアファイルのオンデマンドストリーミングに使用する CloudFront ディストリビューションに対してトリガーを作成することはできません。

ネットワークアクセス

オリジンリクエストイベントおよびオリジンレスポンスイベントによってトリガーされる関数で、インターネット上のリソースや、AWS リージョンの S3 バケット、DynamoDB テーブル、EC2 インスタンスなどのサービスに対してネットワーク呼び出しを実行できます。

ビューワーリクエストイベントとビューワーレスポンスイベントではネットワーク呼び出しはサポートされていません。

クエリ文字列パラメータ

  • Lambda 関数のクエリ文字列にアクセスするには、event.Records[0].cf.request.querystring を使用します。

  • 関数によりビューワーとオリジンリクエストイベントのクエリ文字列を更新できます。更新されたクエリ文字列に、スペース、制御文字、またはフラグメント ID (#) を含めることはできません。

  • 関数によりオリジンとビューワーリクエストイベントのみのクエリ文字列を読み込むことができます。

  • クエリ文字列パラメーターに基づいてキャッシュするように CloudFront を設定することは、関数がクエリ文字列にアクセスできるかどうかに影響します。

    • ビューワーリクエストと応答のイベント – 関数は クエリ文字列の転送とキャッシュ の設定に関係なく、クエリ文字列にアクセスできます。

    • オリジンリクエストと応答イベント – 関数は クエリ文字列の転送とキャッシュ が [Forward All, Cache Based on Whitelist] または [Forward All, Cache Based on All] に設定されている場合にのみクエリ文字列にアクセスできます。

  • URI およびクエリ文字列のパーセントエンコードを使用することをお勧めします。詳細については、「URI とクエリ文字列エンコード」を参照してください。

  • URI (event.Records[0].cf.request.uri) およびクエリ文字列 (event.Records[0].cf.request.querystring) の合計サイズは、8,192 文字未満にする必要があります。

詳細については、「クエリ文字列パラメータに基づいてキャッシュするように CloudFront を設定する」を参照してください。

レスポンスサイズの制限

Lambda 関数によって生成されるレスポンスの最大サイズ (ヘッダーと本文を含む) は、関数をトリガーするイベントによって異なります。

  • ビューワーリクエストイベント – 40 KB

  • オリジンリクエストイベント – 256 KB

レスポンスがこの許容サイズを超えていると、HTTP 502 ステータスコード (Bad Gateway) がビューワーに返されます。

URI

関数でリクエストの URI を変更しても、リクエストのキャッシュ動作や転送先オリジンは変わりません。

URI とクエリ文字列エンコード

Lambda 関数では、URI とクエリ文字列が UTF-8 でエンコードされている必要があります。(パーセントエンコードは UTF-8 エンコードと互換性があります)。CloudFront と Lambda の動作は、以下に依存します。

  • ビューワーからのリクエストで CloudFront が受け取った URI とクエリ文字列のエンコード

  • URI またはクエリ文字列がビューワーリクエストまたはオリジンリクエストイベントによってトリガーされる関数により変更されたかどうか

値が UTF-8 でエンコードされている

CloudFront は、Lambda 関数に値を変更せずに転送します。

値が ISO 8859-1 でエンコードされている

CloudFront は、値を Lambda 関数に転送する前に、ISO 8859-1 文字エンコードを UTF-8 エンコードに変換します。

その他の文字エンコードを使用してエンコードされた値

値が他の文字エンコードを使用してエンコードされている場合、CloudFront は値を ISO 8859-1 エンコードとみなし、ISO 8859-1 エンコードから UTF-8 エンコードに変換しようとします。

重要

変換されたバージョンは、元のリクエストの値を不正確に解釈している可能性があります。これにより、Lambda 関数またはオリジンが意図しない結果を生成することがあります。

CloudFront がオリジンサーバーに転送する値は、ビューワーリクエストまたはオリジンリクエストイベントによってトリガーされた関数が URI またはクエリ文字列を変更するかどうかにより異なります。

  • 関数が URI またはクエリ文字列を変更しない場合 – CloudFront はビューワーからのリクエストで CloudFront が受け取った値をオリジンサーバーに転送します。

  • 関数が実際に URI またはクエリ文字列を変更する場合 – CloudFront は UTF-8 でエンコードされた値を転送します。

どちらの場合も、動作はビューワーからのリクエストの文字エンコードの影響は受けません。