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

Lambda 関数の要件と制限

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

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

  • 別の AWS アカウントによって所有されている CloudFront ディストリビューションに Lambda 関数を関連付けることはできません。

Lambda 関数の CloudFront トリガー

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

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

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

CloudWatch Logs

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

ヘッダー

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

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

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

  • 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 の検証に失敗します。CloudFront は、ビューワーに HTTP ステータスコード 502 (不正なゲートウェイ) を返します。

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

  • Content-Length

  • Host

  • Transfer-Encoding

  • Via

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

  • Accept-Encoding

  • Content-Length

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Transfer-Encoding

  • Via

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

  • Transfer-Encoding

  • Via

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

  • Content-Encoding

  • Content-Length

  • Transfer-Encoding

  • Warning

  • Via

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

CloudFront は、オリジンから 400 以上の HTTP ステータスコードが返された場合、ビューワーレスポンスイベントに対して Lambda 関数を実行しません。リクエストが成功した場合、ビューワーレスポンスイベントから HTTP ステータスコードを変更することもできません。

ただし、HTTP ステータスコード 4xx と 5xx を含むオリジンレスポンスエラーの Lambda 関数を実行することができます。詳細については、「origin-response トリガーでの HTTP レスポンスの更新」を参照してください。

Lambda 関数の設定と実行環境

  • nodejs8.10nodejs10.x、または python3.7 ランタイムプロパティを使用して関数を作成する必要があります。

    注記

    関数に nodejs6.10 プロパティがある場合でも、この関数を編集し、CloudFront ディストリビューションに関連付けることができます。詳細については、AWS Lambda Developer Guideの「 ランタイムサポートポリシー」を参照してください。

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

  • 別の AWS アカウントによって所有されている CloudFront ディストリビューションに Lambda 関数を関連付けることはできません。

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

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

  • レイヤーを使用する関数は、サポートされていません。

  • AWS X-Ray はサポートされていません。

制限

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

Microsoft Smooth Streaming

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

ネットワークアクセス

オリジンのリクエストおよびレスポンスイベントによってトリガーされる関数、およびビューワーのリクエストおよびレスポンスイベントによってトリガーされる関数は、インターネット上のリソースや AWS のサービス (Amazon S3 バケット、DynamoDB テーブル、Amazon 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 文字未満にする必要があります。

詳細については、「クエリ文字列パラメータに基づくコンテンツのキャッシュ」を参照してください。

Include Body オプションがある本文のサイズ制限

[Include Body] オプションを選択すると、Lambda 関数にリクエストボディが公開され、本文の一部の次のサイズ制限が公開されて置き換えられることに注意してください。

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

  • 本文は公開される前、常に Lambda@Edge で Base64 エンコードされています。

  • リクエストボディが大きい場合は、公開する前に Lambda@Edge によって切り捨てられます。

Lambda 関数に本文を公開するときに制限

Lambda@Edge は、Lambda 関数に公開する本文を次のように切り捨てます。

  • ビューワーリクエストの場合、本文は 40 KB で切り捨てられます。

  • オリジンリクエストの場合、本文は 1 MB で切り捨てられます。

Lambda 関数からリクエストボディを返すときに制限

読み取り専用でリクエストボディにアクセスする場合、元の完全なリクエストボディがオリジンに返されます。

ただし、リクエストボディを置き換えることを選択する場合、次の本文サイズの制限は、Lambda 関数から返されるときに適用されます。

エンコード済み本文のタイプ 使用できる本文サイズ: ビューワーリクエスト 使用できる本文サイズ: オリジンリクエスト

text

40 KB

1 MB

base64

53.2 KB

1.33 MB

タグ付け

Amazon CloudFront と AWS Lambda を含む一部の AWS のサービスは、サービス内のリソースへのタグの追加をサポートしています。ただし、現時点では、Lambda@Edge リソースにタグを適用することはできません。CloudFront でのタグ付けの詳細については、「Amazon CloudFront ディストリビューションのタグ付け」を参照してください。

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 でエンコードされた値を転送します。

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