カスタムオリジンの場合のリクエストおよびレスポンスの動作 - Amazon CloudFront

カスタムオリジンの場合のリクエストおよびレスポンスの動作

カスタムオリジンの使用時に CloudFront がリクエストとレスポンスを処理する方法については、以下のセクションを参照してください。

CloudFront がリクエストを処理してカスタムオリジンに転送する方法

CloudFront がビューワーのリクエストを処理してカスタムオリジンに転送する方法について説明します。

認証

Authorization ヘッダーをオリジンに転送すると、次のタイプのリクエストに対してクライアント認証を要求するようにオリジンサーバーを設定できます。

  • DELETE

  • GET

  • HEAD

  • PATCH

  • PUT

  • POST

OPTIONS リクエストの場合、次の CloudFront 設定を使用した場合のみ、クライアント認証を設定できます。

  • CloudFront は、Authorization ヘッダーをオリジンに転送するように設定されます。

  • CloudFront は、OPTIONS リクエストへの応答をキャッシュしないように設定されます。

詳細については、「Authorization ヘッダーを転送するように CloudFront を設定する」を参照してください。

HTTP または HTTPS を使用して、リクエストをオリジンサーバーに転送できます。詳細については、「CloudFront で HTTPS を使用する」を参照してください。

キャッシュ期間および最小 TTL

CloudFront が別のリクエストをオリジンに転送するまでにオブジェクトを CloudFront キャッシュに保持する時間を制御するには、次の手順を実行します。

  • Cache-Control または Expires ヘッダーフィールドを各オブジェクトに追加するようにオリジンを構成します。

  • CloudFront キャッシュ動作で、最小 TTL の値を指定します。

  • デフォルト値の 24 時間を使用します。

詳細については、「コンテンツをキャッシュに保持する期間 (有効期限) を管理する」を参照してください。

クライアント IP アドレス

ビューワーがリクエストを CloudFront に送信し、X-Forwarded-For リクエストヘッダーを含めない場合、CloudFront は TCP 接続からビューワーの IP アドレスを取得して、IP アドレスが含まれた X-Forwarded-For ヘッダーを追加し、リクエストをオリジンに転送します。たとえば、CloudFront が TCP 接続から IP アドレス 192.0.2.2 を取得する場合、以下のヘッダーをオリジンに転送します。

X-Forwarded-For: 192.0.2.2

ビューワーがリクエストを CloudFront に転送して X-Forwarded-For リクエストヘッダーを含める場合、CloudFront はビューワーの IP アドレスを TCP 接続から取得してそれを X-Forwarded-For ヘッダーの末尾に追加し、リクエストをオリジンに転送します。たとえば、ビューワーのリクエストに X-Forwarded-For: 192.0.2.4,192.0.2.3 が含まれ、CloudFront が TCP 接続から IP アドレス 192.0.2.2 を取得する場合、以下のヘッダーをオリジンに転送します。

X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2

ロードバランサー (Elastic Load Balancing を含む)、ウェブアプリケーションファイアウォール、リバースプロキシ、侵入防御システム、API Gateway などの一部のアプリケーションでは、リクエストを転送した CloudFront エッジサーバーの IP アドレスが X-Forwarded-For ヘッダーの末尾に付加されます。たとえば、CloudFront から ELB に転送するリクエストに X-Forwarded-For: 192.0.2.2 が含まれていて、CloudFront エッジサーバーの IP アドレスが 192.0.2.199 である場合、EC2 インスタンスで受け取るリクエストのヘッダーは次のようになります。

X-Forwarded-For: 192.0.2.2,192.0.2.199

注記

X-Forwarded-For ヘッダーには、IPv4 アドレス (192.0.2.44 など) および IPv6 アドレス (2001:0db8:85a3::8a2e:0370:7334 など) が含まれます。

また、X-Forwarded-For ヘッダーは現在のサーバー (CloudFront) へのパス上のすべてのノードによって変更される可能性があることにも注意してください。詳細については、RFC 7239 のセクション 8.1 を参照してください。CloudFront エッジコンピューティング関数を使用してヘッダーを変更することもできます。

クライアント側の SSL 認証

CloudFront はクライアント側の SSL 証明書を使用したクライアント認証をサポートしていません。オリジンがクライアント側証明書をリクエストした場合、CloudFront はリクエストを削除します。

圧縮

詳しくは、「圧縮ファイルを供給する」を参照してください。

条件付きリクエスト

CloudFront は、エッジキャッシュで有効期限切れになっているオブジェクトに対するリクエストを受け取ると、リクエストをオリジンに転送し、オブジェクトの最新バージョンを取得するか、CloudFront エッジキャッシュに最新バージョンがすでに存在することをオリジンに確認します。通常、オリジンはオブジェクトを CloudFront に最後に送信するときに、ETag 値または LastModified 値、あるいはその両方の値をレスポンスに含めます。CloudFront は、CloudFront がオリジンに転送する新しいリクエストには、次のどちらかまたは両方を追加します。

  • オブジェクトの有効期限切れバージョンの If-Match 値が含まれる If-None-Match または ETag ヘッダー。

  • オブジェクトの有効期限切れバージョンの If-Modified-Since 値が含まれる LastModified ヘッダー。

オリジンは、この情報を使用して、オブジェクトが更新されているかどうかを判別します。つまり、オブジェクト全体を CloudFront に返すか、または HTTP 304 ステータスコード (変更なし) のみを返すかを判別します。

注記

If-Modified-SinceIf-None-Match の条件付きリクエストは、CloudFront が Cookie (すべてまたはサブセット) を転送するように設定されている場合はサポートされません。

詳細については、「Cookie に基づいてコンテンツをキャッシュする」を参照してください。

Cookie

Cookie をオリジンに転送するように CloudFront を構成できます。詳細については、「Cookie に基づいてコンテンツをキャッシュする」を参照してください。

クロスオリジンリソース共有 (CORS)

CloudFront で Cross-Origin Resource Sharing 設定を適用する場合は、Origin ヘッダーをオリジンに転送するように CloudFront を設定します。詳しくは、「リクエストヘッダーに基づいてコンテンツをキャッシュする」を参照してください。

暗号化

HTTPS を使用してリクエストを CloudFront に送信するようにビューワーに要求し、ビューワーが使用しているプロトコルを使用してカスタムオリジンにリクエストを転送するように CloudFront に要求することもできます。詳細については、次のディストリビューション設定を参照してください。

CloudFront は、SSLv3、TLSv1.0、TLSv1.1 および TLSv1.2 プロトコルを使用して、HTTPS リクエストをオリジンサーバーに転送します。カスタムオリジンでは、オリジンと通信する際に CloudFront が使用する SSL プロトコルを選択できます。

  • CloudFront コンソールを使用する場合は、[オリジン SSL プロトコル] チェックボックスを使用するプロトコルを選択します。詳細については、「ディストリビューションを作成する」を参照してください。

  • CloudFront API を使用する場合は、OriginSslProtocols 要素を使用してプロトコルを指定します。詳細については、Amazon CloudFront API リファレンスの「OriginSslProtocols」および「DistributionConfig」を参照してください。

オリジンが Amazon S3 バケットの場合、CloudFront は常に TLSv1.2 を使用します。

重要

SSL と TLS のその他のバージョンはサポートされていません。

CloudFront での HTTPS の使用の詳細については、「CloudFront で HTTPS を使用する」を参照してください。ビューワーと CloudFront との間、および CloudFront とオリジンとの間の HTTPS 通信で CloudFront がサポートする暗号のリストについては、ビューワーと CloudFront との間でサポートされているプロトコルと暗号 を参照してください。

本文が含まれている GET リクエスト

ビューワー GET のリクエストの本文が含まれている場合、CloudFront はビューワーに HTTP ステータスコード 403 (禁止) を返します。

HTTP メソッド

サポートするすべての HTTP メソッドを処理するよう CloudFront を構成すると、CloudFront はビューワーからの以下のリクエストを受け入れてカスタムオリジンに転送します。

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

CloudFront は、GET リクエストと HEAD リクエストへの応答を常にキャッシュします。OPTIONS リクエストへの応答をキャッシュするように CloudFront を設定することもできます。CloudFront はその他のメソッドを使用するリクエストへのレスポンスをキャッシュしません。

カスタムオリジンが上記のメソッドを処理するかどうかを構成する方法の詳細については、オリジンのドキュメントを参照してください。

重要

CloudFront がサポートするすべての HTTP メソッドを受け入れてオリジンに転送するように CloudFront を構成する場合、オリジンサーバーがすべてのメソッドを処理するように構成します。たとえば、POST を使用するために、上記のメソッドを受け入れて転送するように CloudFront を構成する場合は、DELETE リクエストを適切に処理するようオリジンサーバーを構成して、削除すべきでないリソースをビューワーが削除できないようにする必要があります。詳細については、HTTP サーバーのドキュメントを参照してください。

HTTP リクエストヘッダーと CloudFront の動作 (カスタムオリジンおよび Amazon S3 オリジン)

次の表は、カスタムオリジンと Amazon S3 オリジンの両方に転送できる HTTP リクエストヘッダーを示しています (例外も注記されています)。この表には、各ヘッダーについて以下に関する情報も含まれています。

  • ヘッダーをオリジンに転送するように CloudFront を設定していない場合の CloudFront の動作。この場合、CloudFront はヘッダー値に基づいてオブジェクトをキャッシュします。

  • そのヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定できるかどうか。

    Date および User-Agent ヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定できますが、これはお勧めできません。これらのヘッダーには可能な値が多数あり、その値に基づいてキャッシュすると、CloudFront がオリジンに転送するリクエストの数が大幅に増加します。

ヘッダー値に基づくキャッシュの詳細については、「リクエストヘッダーに基づいてコンテンツをキャッシュする」を参照してください。

ヘッダー ヘッダー値に基づいてキャッシュするように CloudFront を設定しない場合の動作 ヘッダー値に基づくキャッシュがサポートされている

他の定義されたヘッダー

レガシーキャッシュ設定 – CloudFront はヘッダーをオリジンに転送します。

はい

Accept

CloudFront はヘッダーを削除します。

はい

Accept-Charset

CloudFront はヘッダーを削除します。

はい

Accept-Encoding

値に gzip または br が含まれている場合、CloudFront は正規化された Accept-Encoding ヘッダーをオリジンに転送します。

詳細については、「圧縮のサポート」および「圧縮ファイルを供給する」を参照してください。

はい

Accept-Language

CloudFront はヘッダーを削除します。

はい

Authorization

  • GETHEAD の各リクエスト – CloudFront は、リクエストをオリジンに転送する前に Authorization ヘッダーフィールドを削除します。

  • OPTIONS リクエスト – Authorization リクエストへの応答をキャッシュするように CloudFront を設定した場合、CloudFront は、リクエストをオリジンに転送する前に、OPTIONS ヘッダーフィールドを削除します。

    OPTIONS リクエストへの応答をキャッシュするように CloudFront を設定しなかった場合、CloudFront は、Authorization ヘッダーフィールドをオリジンに転送します。

  • DELETEPATCHPOSTPUT の各リクエスト – CloudFront は、リクエストをオリジンに転送する前にヘッダーフィールドを削除しません。

はい

Cache-Control

CloudFront はヘッダーをオリジンに転送します。

いいえ

CloudFront-Forwarded-Proto

CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。

詳細については、「リクエストのプロトコルに基づいてキャッシュを設定する」を参照してください。

はい

CloudFront-Is-Desktop-Viewer

CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。

詳細については、「デバイスタイプに基づいてキャッシュを設定する」を参照してください。

はい

CloudFront-Is-Mobile-Viewer

CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。

詳細については、「デバイスタイプに基づいてキャッシュを設定する」を参照してください。

はい

CloudFront-Is-Tablet-Viewer

CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。

詳細については、「デバイスタイプに基づいてキャッシュを設定する」を参照してください。

はい

CloudFront-Viewer-Country

CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。

はい

Connection

CloudFront は、オリジンにリクエストを転送する前に、このヘッダーを Connection: Keep-Alive ヘッダーに置き換えます。

いいえ

Content-Length

CloudFront はヘッダーをオリジンに転送します。

いいえ

Content-MD5

CloudFront はヘッダーをオリジンに転送します。

はい

Content-Type

CloudFront はヘッダーをオリジンに転送します。

はい

Cookie

Cookie を転送するように CloudFront を設定すると、Cookie ヘッダーフィールドがオリジンに転送されます。そうでない場合、CloudFront は Cookie ヘッダーフィールドを削除します。詳細については、「Cookie に基づいてコンテンツをキャッシュする」を参照してください。

いいえ

Date

CloudFront はヘッダーをオリジンに転送します。

はい、ただし推奨されません

Expect

CloudFront はヘッダーを削除します。

はい

From

CloudFront はヘッダーをオリジンに転送します。

はい

Host

CloudFront は、リクエストされたオブジェクトに関連付けられたオリジンのドメイン名に値を設定します。

Amazon S3 または MediaStore オリジンのホストヘッダーに基づいてキャッシュすることはできません。

はい (カスタム)

いいえ (S3 および MediaStore)

If-Match

CloudFront はヘッダーをオリジンに転送します。

はい

If-Modified-Since

CloudFront はヘッダーをオリジンに転送します。

はい

If-None-Match

CloudFront はヘッダーをオリジンに転送します。

はい

If-Range

CloudFront はヘッダーをオリジンに転送します。

はい

If-Unmodified-Since

CloudFront はヘッダーをオリジンに転送します。

はい

Max-Forwards

CloudFront はヘッダーをオリジンに転送します。

いいえ

Origin

CloudFront はヘッダーをオリジンに転送します。

はい

Pragma

CloudFront はヘッダーをオリジンに転送します。

いいえ

Proxy-Authenticate

CloudFront はヘッダーを削除します。

いいえ

Proxy-Authorization

CloudFront はヘッダーを削除します。

いいえ

Proxy-Connection

CloudFront はヘッダーを削除します。

いいえ

Range

CloudFront はヘッダーをオリジンに転送します。詳細については、「CloudFront がオブジェクトの部分的リクエスト (レンジ GET) を処理する方法」を参照してください。

はい (デフォルト)

Referer

CloudFront はヘッダーを削除します。

はい

Request-Range

CloudFront はヘッダーをオリジンに転送します。

いいえ

TE

CloudFront はヘッダーを削除します。

いいえ

Trailer

CloudFront はヘッダーを削除します。

いいえ

Transfer-Encoding

CloudFront はヘッダーをオリジンに転送します。

いいえ

Upgrade

WebSocket 接続が確立されていない限り、CloudFront はヘッダーを削除します。

いいえ (WebSocket 接続の場合を除く)

User-Agent

CloudFront はこのヘッダーフィールドの値を Amazon CloudFront に置き換えます。ユーザーが使用しているデバイスに基づいて CloudFront でコンテンツをキャッシュする場合は、「デバイスタイプに基づいてキャッシュを設定する」を参照してください。

はい、ただし推奨されません

Via

CloudFront はヘッダーをオリジンに転送します。

はい

Warning

CloudFront はヘッダーをオリジンに転送します。

はい

X-Amz-Cf-Id

CloudFront は、リクエストをオリジンに転送する前に、ビューワーリクエストにヘッダーを追加します。ヘッダー値には、リクエストを一意に識別する暗号化された文字列が含められます。

いいえ

X-Edge-*

CloudFront はすべての X-Edge-* ヘッダーを削除します。

いいえ

X-Forwarded-For

CloudFront はヘッダーをオリジンに転送します。詳細については、「クライアント IP アドレス」を参照してください。

はい

X-Forwarded-Proto

CloudFront はヘッダーを削除します。

いいえ

X-HTTP-Method-Override

CloudFront はヘッダーを削除します。

はい

X-Real-IP

CloudFront はヘッダーを削除します。

いいえ

HTTP バージョン

CloudFront は HTTP/1.1 を使用してカスタムオリジンにリクエストを転送します。

リクエストの最大長と URL の最大長

パス、クエリ文字列 (ある場合)、ヘッダーを含め、リクエストの最大長は 20480 バイトです。

CloudFront はリクエストから URL を構築します。この URL の最大長は 8192 文字です。

リクエストまたは URL がこの最大制限を超えると、CloudFront は、リクエストヘッダーフィールドが長すぎることを示す HTTP ステータスコード 413 (Request Entity Too Large) をビューワーに返してから、ビューワーへの TCP 接続を終了します。

OCSP stapling

オブジェクトに対する HTTPS リクエストをビューワーが送信する際には、ドメインの SSL 証明書が無効になっていないことを CloudFront またはビューワーが認証機関 (CA) に対して確認する必要があります。OCSP Stapling を使用すると、CloudFront で証明書を検証して CA からの応答をキャッシュできるため、クライアントが直接 CA に対して証明書を検証する必要がなくなり、証明書の検証速度が向上します。

同一ドメイン内のオブジェクトに対する多数の HTTPS リクエストを CloudFront が受信した場合は、OCSP Stapling によるパフォーマンス向上がさらに顕著になります。CloudFront エッジロケーション内の各サーバーは、別々の検証リクエストを送信する必要があります。同一ドメインに対する多数の HTTPS リクエストを CloudFront が受信するとすぐに、エッジロケーション内のすべてのサーバーが、SSL ハンドシェイクでパケットに「ステープリング」できるという CA からの応答を受信します。証明書が有効であることをビューワーが確認すると、CloudFront はリクエストされたオブジェクトを提供できます。CloudFront エッジロケーション内でディストリビューションが十分なトラフィックを確保できない場合、新しいリクエストは、CA に対して証明書がまだ検証されていないサーバーに誘導される可能性が高くなります。この場合は、ビューワーが検証ステップを別途実行し、CloudFront サーバーがオブジェクトを提供します。この CloudFront サーバーも CA に検証リクエストを送信するため、同じドメイン名が含まれるリクエストを次に受信したときには、CA からの検証応答が既に存在しているということになります。

持続的接続

CloudFront がオリジンからレスポンスを取得すると、その期間中に別のリクエストが届くのに備え、数秒間、接続を維持しようとします。持続的接続を維持すると、TCP 接続の再構築に必要な時間と後続のリクエストに対する別の TLS ハンドシェイクの実行に必要な時間を節約できます。

持続的接続の期間を設定する方法など、詳細については、「キープアライブタイムアウト (カスタムオリジンのみ)」セクションの「ディストリビューション設定リファレンス」を参照してください。

プロトコル

CloudFront は、以下の項目に基づいて、HTTP または HTTPS リクエストをオリジンサーバーに転送します。

  • ビューワーが CloudFront に送信したリクエストのプロトコル (HTTP または HTTPS)。

  • CloudFront コンソールの [オリジンプロトコルポリシー] フィールドの値。または、CloudFront API を使用する場合は、OriginProtocolPolicy 複合型の DistributionConfig エレメントの値。CloudFront コンソールで使用できるオプションは、[HTTP のみ]、[HTTPS のみ]、および [一致ビューワー] です。

[HTTP のみ] または [HTTPS のみ] を指定すると、CloudFront では、ビューワーリクエストのプロトコルに関係なく、指定されたプロトコルのみを使用してリクエストをオリジンサーバーに転送します。

[一致ビューワー] を指定した場合、CloudFront はビューワーリクエストのプロトコルを使用してリクエストをオリジンサーバーに転送します。ビューワーが HTTP と HTTPS の両方のプロトコルを使用してリクエストを行った場合も、CloudFront がオブジェクトをキャッシュするのは 1 回だけです。

重要

CloudFront が HTTPS プロトコルを使用してリクエストをオリジンに転送し、オリジンサーバーから無効な証明書または自己署名証明書が返された場合、CloudFront は TCP 接続を中断します。

CloudFront コンソールを使用してディストリビューションを更新する方法については、「ディストリビューションを更新する」を参照してください。CloudFront API を使用してディストリビューションを更新する方法については、Amazon CloudFront API リファレンスの「UpdateDistribution」を参照してくださいCloudFront。

クエリ文字列

CloudFront でクエリ文字列パラメータをオリジンに転送するかどうかを構成できます。詳細については、「クエリ文字列パラメータに基づいてコンテンツをキャッシュする」を参照してください。

オリジン接続のタイムアウトと試行

オリジン接続タイムアウトは、オリジンへの接続を確立しようとしたときに CloudFront が待機する秒数です。

オリジン接続試行は、CloudFront がオリジンへの接続を試行する回数です。

これらの設定により、セカンダリオリジンにフェイルオーバーするか (オリジングループの場合)、ビューワーにエラーレスポンスを返す前に、CloudFront がオリジンへの接続を試行する時間が決まります。デフォルトでは、CloudFront はセカンダリオリジンへの接続を試行したり、エラーレスポンスを返したりする前に 30 秒 (それぞれ 10 秒間の試行が 3 回) 待機します。接続タイムアウトを短くするか、試行回数を減らすか、その両方を行うことで、この時間を短縮できます。

詳細については、「オリジンのタイムアウトと試行を制御する」を参照してください。

オリジン応答タイムアウト

オリジン応答タイムアウト (オリジンの読み取りタイムアウトまたはオリジンリクエストタイムアウトとも呼ばれます) は、次の両方に適用されます。

  • CloudFront がリクエストをオリジンに転送してからレスポンスを受け取るまでの待機時間 (秒)。

  • CloudFront がオリジンからレスポンスのパケットを受け取ってから次のパケットを受け取るまでの待機時間 (秒)。

CloudFront の動作は、ビューワーリクエストの HTTP メソッドによって決まります。

  • GET および HEAD リクエスト ― 応答タイムアウトの期間内にオリジンが応答しない場合、または応答を停止した場合、CloudFront は接続を中断します。指定されたオリジン接続の試行回数が 1 回を超える場合、CloudFront は完全な応答の取得を再試行します。オリジン接続の試行回数設定の値で決められているように、CloudFront は最大 3 回試行します。最後の試行でもオリジンが応答しない場合、CloudFront は同じオリジンのコンテンツに対する別のリクエストを受け取るまで接続を試みません。

  • DELETEOPTIONSPATCHPUTPOST リクエスト – オリジンが 30 秒以内に応答しない場合、CloudFront は接続を中断し、オリジンへの接続を再試行しません。クライアントは、必要に応じてリクエストを再送信できます。

オリジン応答タイムアウトを設定する方法など、詳細については、「応答タイムアウト (カスタムオリジンのみ)」を参照してください。

同一オブジェクトへの同時リクエスト (リクエストを折りたたむ)

CloudFront エッジロケーションがオブジェクトのリクエストを受け取り、オブジェクトが現在キャッシュにないか、有効期限が切れている場合、CloudFront はすぐにオリジンにリクエストを送信します。ただし、同一オブジェクトへの同時リクエストがある場合 (同じキャッシュキーを使用)、CloudFront が最初のリクエストへのレスポンスを受信する前に、同一オブジェクト (同じキャッシュキー) への追加のリクエストがエッジロケーションに届く場合、CloudFront は一時停止してから、追加のリクエストをオリジンに転送します。この短い一時停止により、オリジンでの負荷を減らすことができます。CloudFront は、一時停止中に受け取ったすべてのリクエストに、元のリクエストからのレスポンスを送信します。これはリクエストの折りたたみと呼ばれます。CloudFront ログでは、最初のリクエストは x-edge-result-type フィールドで Miss と識別され、折りたたまれたリクエストは Hit とし識別されます。CloudFront ログの詳細については、「CloudFront とエッジ関数のログ記録」を参照してください。

CloudFront は、キャッシュキーを共有するリクエストのみを折りたたみます。リクエストヘッダーまたはクッキーまたはクエリ文字列に基づいてキャッシュするように CloudFront を設定した場合など、追加のリクエストが同じキャッシュキーを共有しない場合、CloudFront は一意のキャッシュキーを持つすべてのリクエストをオリジンに転送します。

すべてのリクエストの折りたたみを防ぐ場合は、マネージドキャッシュポリシー CachingDisabled を使用できます (このポリシーはキャッシュも防ぎます)。詳細については、「マネージドキャッシュポリシーを使用する」を参照してください。

特定のオブジェクトへのリクエストの折りたたみを防ぐ場合は、キャッシュ動作の最小 TTL を 0 に設定し、さらに Cache-Control: privateCache-Control: no-storeCache-Control: no-cacheCache-Control: max-age=0、または Cache-Control: s-maxage=0 を送信するようにオリジンを設定できます。これらの設定に伴ってオリジンへの負荷が増え、CloudFront が最初のリクエストへのレスポンスを待機中に一時停止される同時リクエストのレイテンシーが高くなります。

重要

現在、キャッシュポリシーオリジンリクエストポリシー、またはレガシーキャッシュ設定で Cookie 転送を有効にした場合、CloudFront はリクエストの折りたたみをサポートしません。

User-Agent ヘッダー

ユーザーがコンテンツの表示に使用しているデバイスに基づいて、オブジェクトの異なるバージョンを CloudFront でキャッシュするには、次の 1 つ以上のヘッダーをカスタムオリジンに転送するように CloudFront を設定することをお勧めします。

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

CloudFront は、User-Agent ヘッダーの値に基づいて、これらのヘッダーの値を true または false に設定した後、リクエストをオリジンに転送します。デバイスが複数のカテゴリに属する場合は、複数の値が true になることがあります。たとえば、一部のタブレットデバイスに対して、CloudFront が CloudFront-Is-Mobile-ViewerCloudFront-Is-Tablet-Viewer の両方を true に設定する場合があります。リクエストヘッダーに基づいてキャッシュするように CloudFront を設定する方法の詳細については、「リクエストヘッダーに基づいてコンテンツをキャッシュする」を参照してください。

User-Agent ヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定できますが、これはお勧めできません。User-Agent ヘッダーには可能な値が多数あり、その値に基づいてキャッシュすると、CloudFront がオリジンに転送するリクエストの数が大幅に増加します。

CloudFront が User-Agent ヘッダーの値に基づいてオブジェクトをキャッシュするように設定しない場合、CloudFront は以下の値を指定した User-Agent ヘッダーを追加して、リクエストをオリジンに転送します。

User-Agent = Amazon CloudFront

CloudFront は、ビューワーからのリクエストに User-Agent ヘッダーが含まれているかどうかに関係なく、このヘッダーを追加します。ビューワーからのリクエストに User-Agent ヘッダーが含まれる場合、CloudFront はそのヘッダーを削除します。

CloudFront がカスタムオリジンからのレスポンスを処理する方法

CloudFront がカスタムオリジンからのレスポンスを処理する方法について説明します。

100 Continue 件のレスポンス

オリジンは複数の 100-continue レスポンスを CloudFront に送信することはできません。最初の 100-continue レスポンスの後で、CloudFront は HTTP 200 OK レスポンスを予期します。オリジンが最初のレスポンスの後に別の 100-continue レスポンスを送信すると、CloudFront はエラーを返します。

キャッシュ

取り消されたリクエスト

オブジェクトがエッジキャッシュになく、CloudFront がオブジェクトをオリジンから取得したものの、リクエストされたオブジェクトを配信する前にビューワーがセッションを終了すると (ブラウザを閉じるなど)、CloudFront はそのオブジェクトをエッジロケーションにキャッシュしません。

コンテンツネゴシエーション

オリジンが応答で Vary:* を返し、対応するキャッシュ動作の [最小 TTL] の値が [0] の場合、CloudFront はオブジェクトをキャッシュしますが、そのオブジェクトの後続のすべてのリクエストをオリジンに転送して、キャッシュにオブジェクトの最新バージョンが含まれていることを確認します。CloudFront には、If-None-MatchIf-Modified-Since などの条件付きヘッダーは含まれません。その結果、オリジンはすべてのリクエストに応じて CloudFront にオブジェクトを返します。

オリジンが応答で Vary:* を返し、対応するキャッシュ動作の [最小 TTL] の値が別の値になっている場合、CloudFront は「Vary」に記述されている方法で CloudFront が削除または置き換える HTTP レスポンスヘッダー ヘッダーを処理します。

cookie

キャッシュ動作の Cookie を有効にしており、オリジンが Cookie とオブジェクトを返す場合、CloudFront はオブジェクトと Cookie の両方をキャッシュします。これにより、オブジェクトのキャッシュ可能性が低下します。詳細については、「Cookie に基づいてコンテンツをキャッシュする」を参照してください。

中断された TCP 接続

オリジンがオブジェクトを CloudFront に返している間に CloudFront とオリジン間の TCP 接続が中断した場合、CloudFront の動作は、オリジンが Content-Length ヘッダーをレスポンスに含めたかどうかによって異なります。

  • Content-Length ヘッダーあり – CloudFront は、オブジェクトをオリジンから取得すると、ビューワーにオブジェクトを返します。ただし、Content-Length ヘッダーの値がオブジェクトのサイズに一致しない場合、CloudFront はオブジェクトをキャッシュしません。

  • Transfer-Encoding: Chunked – CloudFront は、オブジェクトをオリジンから取得すると、ビューワーにオブジェクトを返します。ただし、チャンクレスポンスが完了していない場合、CloudFront はオブジェクトをキャッシュしません。

  • Content-Length ヘッダーなし – CloudFront はオブジェクトをビューワーに返して、オブジェクトをキャッシュしますが、オブジェクトが完全でない場合があります。Content-Length ヘッダーがない場合、CloudFront は、TCP 接続が誤って中断されたか、または故意に中断されたかを判断できません。

Content-Length ヘッダーを追加して、CloudFront が不完全なオブジェクトをキャッシュしないように HTTP サーバーを設定することをお勧めします。

CloudFront が削除または置き換える HTTP レスポンスヘッダー

CloudFront は、オリジンからのレスポンスをビューワーに転送する前に、以下のヘッダーフィールドを削除または更新します。

  • Set-Cookie – Cookie を転送するように CloudFront を構成している場合、Set-Cookie ヘッダーフィールドがクライアントに転送されます。詳細については、「Cookie に基づいてコンテンツをキャッシュする」を参照してください。

  • Trailer

  • Transfer-Encoding – オリジンがこのヘッダーフィールドを返す場合、CloudFront は値を chunked に設定してビューワーにレスポンスを返します。

  • Upgrade

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

    • デバイス固有のヘッダーのいずれかをオリジン (CloudFront-Is-Desktop-ViewerCloudFront-Is-Mobile-ViewerCloudFront-Is-SmartTV-ViewerCloudFront-Is-Tablet-Viewer) に転送するように CloudFront を設定しており、オリジンが Vary:User-Agent を CloudFront に返すように設定している場合、CloudFront は Vary:User-Agent をビューワーに返します。詳細については、「デバイスタイプに基づいてキャッシュを設定する」を参照してください。

    • Accept-Encoding ヘッダーに、Cookie または Vary のいずれかを含めるよう設定した場合、CloudFront はビューワーへの応答にその値を含めます。

    • オリジンにヘッダーを転送するように CloudFront を設定し、Vary ヘッダー (例えば Vary:Accept-Charset,Accept-Language) の CloudFront にヘッダー名を返すようにオリジンを設定した場合、CloudFront はこれらの値を持つ Vary ヘッダーをビューワーに返します。

    • CloudFront が * ヘッダーの Vary 値を処理する詳細については、「コンテンツネゴシエーション」を参照してください。

    • Vary ヘッダーで他の値を含めるようにオリジンを設定している場合、CloudFront はその値を削除してからビューワーに応答を返します。

  • Via – CloudFront は、ビューワーへの応答で値を次のように設定します。

    Via: http-version alphanumeric-string.cloudfront.net (CloudFront)

    例えば、値は次のようになります。

    Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)

キャッシュ可能なファイルの最大サイズ

CloudFront がキャッシュに保存するレスポンスボディの最大サイズは 50 GB です。これには、Content-Length ヘッダーの値を指定しないチャンク転送レスポンスが含まれます。

それぞれ 50 GB 以下のパートのオブジェクトをリクエストする範囲リクエストを使用して、このサイズを超えるオブジェクトをキャッシュするには、CloudFront を使用します。CloudFront がこれらのパートをキャッシュするのは、それぞれが 50 GB 以下であるためです。ビューワーによって、オブジェクトのすべてのパートを取得した後、元の大きなオブジェクトが再構築されます。詳しくは、「範囲リクエストを使用して大きなオブジェクトをキャッシュする」を参照してください。

使用できないオリジン

オリジンサーバーが使用できないときに、CloudFront がエッジキャッシュに存在するオブジェクトのリクエストを受け取り、そのオブジェクトが (たとえば、Cache-Control max-age ディレクティブに指定された期間が経過しているために) 有効期限切れになっている場合、CloudFront は有効期限切れバージョンのオブジェクトを提供するか、またはカスタムエラーページを提供します。カスタムエラーページを設定したときの CloudFront の動作の詳細については、「カスタムエラーページが設定されている場合に CloudFront がエラーを処理する方法」を参照してください。

場合によって、要求頻度の低いオブジェクトは削除されてエッジキャッシュで使用できなくなることがあります。CloudFront は、削除されたオブジェクトを提供することはできません。

リダイレクト

オリジンサーバーでオブジェクトの場所を変更した場合、リクエストを新しい場所にリダイレクトするようにウェブサーバーを構成できます。リダイレクトが構成された後、ビューワーがオブジェクトのリクエストを最初に送信したときに、CloudFront はリクエストをオリジンに送信し、オリジンはリダイレクトで応答します (例: 302 Moved Temporarily)。CloudFront はリダイレクトをキャッシュし、ビューワーにリダイレクトを返します。CloudFront はリダイレクトには従いません。

リクエストを以下のどちらかの場所にリダイレクトするようにウェブサーバーを構成できます。

  • オリジンサーバーのオブジェクトの新しい URL。ビューワーが新しい URL へのリダイレクトに従う場合、ビューワーは CloudFront をバイパスし、オリジンに直接アクセスします。つまり、オリジンにあるオブジェクトの新しい URL にリクエストをリダイレクトしないことをお勧めします。

  • オブジェクトの新しい CloudFront URL。新しい CloudFront URL を含むリクエストがビューワーから送信されると、CloudFront は、オリジンの新しい場所からオブジェクトを取得し、エッジロケーションにキャッシュした後、ビューワーにオブジェクトを返します。オブジェクトに対する以降のリクエストはエッジロケーションによって処理されます。これにより、オリジンのオブジェクトを要求するビューワーに関連するレイテンシーと負荷が回避されます。ただし、オブジェクトに対する新しいリクエストごとに、CloudFront への 2 つのリクエストに対する料金がかかります。

Transfer-Encoding ヘッダー

CloudFront は、chunked ヘッダーの Transfer-Encoding 値のみをサポートします。オリジンが Transfer-Encoding: chunked を返した場合、CloudFront は、エッジロケーションで受け取ったオブジェクトをクライアントに返し、そのオブジェクトをチャンク形式でキャッシュして後続のリクエストに備えます。

ビューワーが Range GET をリクエストし、オリジンが Transfer-Encoding: chunked を返す場合、CloudFront はリクエストされた範囲ではなくオブジェクト全体をビューワーに返します。

レスポンスのコンテンツ長を事前に決定できない場合は、チャンクエンコーディングを使用することをお勧めします。詳細については、「中断された TCP 接続」を参照してください。