エッジ関数に対する制限 - Amazon CloudFront

エッジ関数に対する制限

以下のトピックでは、CloudFront Functions と Lambda@Edge に適用される制限について説明します。制限には、すべてのエッジ関数に適用されるものもあれば、CloudFront Functions または Lambda@Edge のみに適用されるものもあります。

クォータ (以前は制限と呼ばれていました) の詳細については、「CloudFront Functions のクォータ」と「Lambda@Edge のクォータ」を参照してください。

すべてのエッジ機能に対する制限

以下の制限は、CloudFront Functions と Lambda@Edge 両方の、すべてのエッジ関数に適用されます。

AWS アカウント の所有権

エッジ関数を CloudFront ディストリビューションに関連付けるには、関数とディストリビューションが同じ AWS アカウント によって所有されている必要があります。

CloudFront Functions と Lambda@Edge との組み合わせ

所定のキャッシュ動作については、以下の制限が適用されます。

  • イベントタイプ (ビューワーリクエスト、オリジンリクエスト、オリジンレスポンス、ビューワーレスポンス) はそれぞれ、エッジ関数の関連付けを 1 つしか持てません。

  • ビューワーイベント (ビューワーリクエストとビューワーレスポンス) で CloudFront Functions と Lambda@Edge を組み合わせることはできません。

上記以外のすべてのエッジ関数の組み合わせが許可されます。以下の表は、許可される組み合わせの説明です。

CloudFront Functions

ビューワーリクエスト

ビューワーレスポンス

Lambda@Edge

ビューワーリクエスト

許可されていません

許可されていません

オリジンリクエスト

許可

許可

オリジンレスポンス

許可

許可

ビューワーレスポンス

許可されていません

許可されていません

HTTP ステータスコード

オリジンが 400 以上の HTTP ステータスコードを返す場合、CloudFront はビューワーレスポンスイベントの Lambda 関数を呼び出しません。

ビューワーレスポンスイベントのエッジ関数は、レスポンスがオリジンまたは CloudFront キャッシュからのものであるかどうかにかかわらず、レスポンスの HTTP ステータスコードを変更できません。

オリジンレスポンスイベントの Lambda@Edge 関数は、オリジンが 400 以上の HTTP ステータスコードを返す場合を含め、すべてのオリジンレスポンスに対して呼び出されます。詳細については、「origin-response トリガーでの HTTP レスポンスの更新」を参照してください。

HTTP ヘッダー

特定の HTTP ヘッダーは許可されていません。これは、これらのヘッダーがエッジ関数に公開されておらず、関数がそれらを追加できないことを意味します。他のヘッダーは読み取り専用です。つまり、関数はこれらを読み取れますが、追加したり変更したりすることはできません。

許可されていないヘッダー

以下の HTTP ヘッダーはエッジ関数に公開されておらず、関数はこれらを追加できません。関数がこれらのヘッダーのいずれかを追加すると、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-Cache

  • X-Edge-*

  • X-Forwarded-Proto

  • X-Real-IP

読み取り専用ヘッダー

以下のヘッダーは読み取り専用です。関数はこれらを読み取って関数ロジックへの入力として使用できますが、値を変更することはできません。関数が読み取り専用ヘッダーを追加または編集すると、リクエストの CloudFront 検証が失敗し、CloudFront がビューワーに HTTP ステータスコード 502 (不正なゲートウェイ) を返します。

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

以下のヘッダーは、ビューワーリクエストイベントでは読み取り専用になります。

  • Content-Length

  • Host

  • Transfer-Encoding

  • Via

オリジンリクエストイベントの読み取り専用ヘッダー (Lambda@Edge 限定)

以下のヘッダーは、Lambda@Edge にしかないオリジンリクエストイベントでは読み取り専用になります。

  • Accept-Encoding

  • Content-Length

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Transfer-Encoding

  • Via

オリジンレスポンスイベントの読み取り専用ヘッダー (Lambda@Edge 限定)

以下のヘッダーは、Lambda@Edge にしかないオリジンレスポンスイベントでは読み取り専用になります。

  • Transfer-Encoding

  • Via

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

以下のヘッダーは、ビューワーレスポンスイベントでは読み取り専用になります。

  • Content-Encoding

  • Content-Length

  • Transfer-Encoding

  • Warning

  • Via

クエリ文字列

以下の制限は、リクエスト URI 内のクエリ文字列を読み取る、更新する、または作成する関数に適用されます。

  • (Lambda@Edge 限定) オリジンリクエストまたはオリジンレスポンス関数のクエリ文字列にアクセスするには、キャッシュポリシーまたはオリジンリクエストポリシーが [Query strings] (クエリ文字列) に対して [All] (すべて) に設定されている必要があります。

  • 関数は、ビューワーリクエストイベントとオリジンリクエストイベントのクエリ文字列を作成または更新できます (オリジンリクエストイベントがあるのは Lambda@Edge だけです)。

  • 関数は、オリジンレスポンスイベントとビューワーレスポンスイベントのクエリ文字列を読み取ることができますが、それらを作成または更新することはできません (オリジンレスポンスイベントがあるのは Lambda@Edge だけです)。

  • 関数がクエリ文字列を作成または更新する場合は、以下の制限が適用されます。

    • クエリ文字列に、スペース、制御文字、またはフラグメント識別子 (#) を含めることはできません。

    • クエリ文字列を含めた URI の合計サイズは、8,192 文字未満にする必要があります。

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

URI

関数がリクエストの URI を変更しても、リクエスト、またはリクエストが転送されるオリジンのキャッシュ動作は変更されません。

クエリ文字列を含めた URI の合計サイズは、8,192 文字未満にする必要があります。

URI とクエリ文字列のエンコーディング

エッジ関数に渡される URI とクエリ文字列値は、UTF-8 でエンコードされています。関数は、それが返す URI とクエリ文字列値に UTF-8 エンコーディングを使用する必要があります。パーセントエンコーディングには、UTF-8 エンコーディングと互換性があります。

以下のリストでは、CloudFront が URI とクエリ文字列値のエンコーディングをどのように処理するかを説明します。

  • リクエスト内の値が UTF-8 でエンコードされている場合、CloudFront はそれらの値を変更せずにそのまま関数に転送します。

  • リクエスト内の値が ISO 8859-1 でエンコードされている場合、CloudFront はそれらの値を UTF-8 エンコーディングに変換してから関数に転送します。

  • リクエスト内の値がその他の文字エンコーディングを使用してエンコードされている場合、CloudFront はそれらが ISO 8859-1 でエンコードされているとみなし、ISO 8859-1 から UTF-8 への変換を試みます。

    重要

    変換された文字は、元のリクエストの値の正しい解釈ではない可能性があります。これは、関数またはオリジンが意図しない結果を生成する原因になる場合があります。

CloudFront がオリジンに転送する URI とクエリ文字列値は、関数がそれらの値を変更するかどうかに応じて異なります。

  • 関数が URI またはクエリ文字列を変更しない場合、CloudFront はリクエストで受け取った値をオリジンに転送します。

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

Microsoft Smooth Streaming

Microsoft Smooth Streaming 形式にトランスコードしたメディアファイルのストリーミングに使用している CloudFront ディストリビューションでエッジ関数を使用することはできません。

Tagging

エッジ関数にタグを追加することはできません。CloudFront でのタグ付けの詳細については、「Amazon CloudFront ディストリビューションのタグ付け」を参照してください。

CloudFront Functions に対する制限

以下の制限は、CloudFront Functions のみに適用されます。

Logs

CloudFront Functions の関数ログは 10 KB で切り捨てられます。

リクエストボディ

CloudFront Functions は、HTTP リクエストのボディにアクセスできません。

Runtime

CloudFront Functions のランタイム環境は動的コード評価をサポートせず、ネットワーク、ファイルシステム、およびタイマーへのアクセスを制限します。詳細については、「制限された機能」を参照してください。

コンピューティング使用率

CloudFront Functions には実行に使用できる時間に対する制限があり、これはコンピューティング使用率として測定されます。コンピューティング使用率は、関数の実行にかかった時間を最大許容時間に対する割合として示す 0 から 100 の数値です。例えば、コンピューティング使用率が 35 の場合、関数は最大許容時間の 35% で完了したことを意味します。

関数をテストするときは、テストイベントの出力でコンピューティング使用率の値を確認できます。production 関数については、CloudWatch、または CloudFront コンソールの [Monitoring] (モニタリング) ページコンピューティング使用率メトリクスを確認できます。

Lambda@Edge に対する制限

以下の制限は、Lambda@Edge のみに適用されます。

Lambda 関数のバージョン

$LATEST やエイリアスではなく、Lambda 関数の番号付きバージョンを使用する必要があります。

Lambda のリージョン

Lambda 関数は、米国東部 (バージニア北部) リージョンにある必要があります。

Lambda のロール許可

Lambda 関数に関連付けられている IAM 実行ロールは、サービスプリンシパル lambda.amazonaws.comedgelambda.amazonaws.com によるそのロールの引き受けを許可する必要があります。詳細については、「Lambda@Edge 用の IAM アクセス権限とロールの設定」を参照してください。

Lambda の機能とサポートされているランタイム

以下の Lambda 機能は、Lambda@Edge でサポートされていません。

Lambda@Edge は、以下のランタイムで Lambda 関数をサポートします。

Node.js

Python

  • Node.js 14

  • Node.js 12

  • Node.js 10²

  • Node.js 8¹

  • Node.js 6¹

  • Python 3.9

  • Python 3.8

  • Python 3.7

¹このバージョンの Node.js は、サポートが終了しました。このバージョンでは、関数を作成または更新できません。このバージョンで既存の関数がある場合は、それを CloudFront ディストリビューションに関連付けることができます。すでにディストリビューションに関連付けられているこのバージョンでの関数は、引き続き実行されます。ただし、関数を新しいバージョンの Node.js に移動することをお勧めします。詳細については、AWS Lambda デベロッパーガイドの「ランタイムサポートポリシー」と、GitHub の Node.js リリーススケジュールを参照してください。

²このバージョンの Node.js は、サポートが終了しました。また、2021 年 8 月 30 日に Lambda での サポート (フェーズ 2) が終了します。2021 年 8 月 30 日以降、このバージョンでは、関数を作成または更新できません。このバージョンで既存の関数がある場合は、それを CloudFront ディストリビューションに関連付けることができます。すでにディストリビューションに関連付けられているこのバージョンでの関数は、引き続き実行されます。ただし、関数を新しいバージョンの Node.js に移動することをお勧めします。詳細については、AWS Lambda デベロッパーガイドの「ランタイムサポートポリシー」と、GitHub の Node.js リリーススケジュールを参照してください。

CloudFront ヘッダー

Lambda@Edge 関数は、以下の任意の CloudFront ヘッダーを読み込む、編集、削除、または追加することができます。

  • 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 はビューワーリクエストイベントの後にヘッダーを追加します。これは、ビューワーリクエスト関数で Lambda@Edge がこれらを利用できないことを意味します。

  • ビューワーリクエストにこれらの名前を持つヘッダーが含まれており、キャッシュポリシーまたはオリジンリクエストポリシーを使用してこれらのヘッダーを追加するように CloudFront を設定した場合は、CloudFront がビューワーリクエストにあったヘッダー値を上書きします。ビューワー向けの関数はビューワーリクエストからのヘッダー値を認識し、オリジン向けの関数は CloudFront が追加したヘッダー値を認識します。

  • ¹CloudFront-Viewer-Country ヘッダー – ビューワーリクエスト関数がこのヘッダーを追加すると、リクエストの検証が失敗し、CloudFront がビューワーに HTTP ステータスコード 502 (不正なゲートウェイ) を返します。

Include Body オプションがあるリクエストボディに対する制限

Lambda@Edge 関数にリクエストボディを公開するために [Include Body] オプションを選択する場合は、公開または置き換えられたボディの一部に以下の情報クォータとサイズクォータが適用されます。

  • CloudFront は常に、リクエストボディを base64 でエンコードしてから、それを Lambda@Edge に公開します。

  • リクエストボディが大きい場合、CloudFront は、ボディを以下のように切り詰めてから Lambda@Edge に公開します。

    • ビューワーリクエストでは、ボディが 40 KB で切り捨てられます。

    • オリジンリクエストでは、ボディが 1 MB で切り捨てられます。

  • 読み取り専用としてリクエストボディにアクセスする場合、CloudFront は元の完全なリクエストボディをオリジンに送信します。

  • Lambda@Edge 関数がリクエストボディを置き換える場合、関数が返すボディに以下のサイズクォータが適用されます。

    • Lambda@Edge 関数がボディをプレーンテキストとして返す場合:

      • ビューワーリクエストでは、ボディが 40 KB で切り捨てられます。

      • オリジンリクエストでは、ボディが 1 MB で切り捨てられます。

    • Lambda@Edge 関数がボディを base64 でエンコードされたテキストとして返す場合:

      • ビューワーリクエストイベントでは、ボディが 53.2 KB で切り捨てられます。

      • オリジンリクエストイベントでは、ボディが 1.33 MB で切り捨てられます。