リクエストヘッダーに基づいてコンテンツをキャッシュする - Amazon CloudFront

リクエストヘッダーに基づいてコンテンツをキャッシュする

CloudFront により、ヘッダーをオリジンに転送し、ビューワーリクエストのヘッダー値に基づいて異なるバージョンのオブジェクトをキャッシュするかどうかを選択できます。こうすることで、ユーザーが使っているデバイスの種類やビューワーの場所、ビューワーで使われている言語など、さまざまな条件に基づいてコンテンツの異なるバージョンを配信できます。

ヘッダーとディストリビューションの概要

デフォルトで、CloudFront では、エッジロケーションでオブジェクトをキャッシュする際にヘッダーが考慮されません。オリジンが 2 つのオブジェクトを返し、そのリクエストヘッダーの値のみが異なる場合、CloudFront はオブジェクトの片方のみをキャッシュします。

ヘッダーをオリジンに転送するように CloudFront を設定できます。その場合、CloudFront は 1 つ以上のリクエストヘッダーの値に基づいてオブジェクトの複数のバージョンをキャッシュします。特定のヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定するには、ディストリビューションのキャッシュ動作の設定を指定します。詳細については、「選択されたリクエストヘッダーに基づいたキャッシュ」を参照してください。

たとえば、logo.jpg のヘッダーオブジェクトがカスタム Product ヘッダーを含み、その値が Acme または Apex であるとします。Product ヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定すると、CloudFront は logo.jpg に関するリクエストをオリジンに転送し、Product ヘッダーとヘッダー値を含めます。CloudFront は、logo.jpg ヘッダーの値が Product であるリクエスト用に 1 回、値が Acme であるリクエスト用に 1 回、Apex をキャッシュします。

ディストリビューションの各キャッシュ動作を以下のいずれかを実行するように設定できます。

  • すべてのヘッダーをオリジンに転送する

    注記

    レガシーキャッシュ設定 - すべてのヘッダーをオリジンに転送するように CloudFront を設定した場合、CloudFront はこのキャッシュ動作に関連付けられたオブジェクトをキャッシュしません。その代わりに、すべてのリクエストをオリジンに送信します。

  • 指定したヘッダーのリストを転送する。CloudFront は、指定されたヘッダーすべての値に基づいてオブジェクトをキャッシュします。CloudFront は、デフォルトで転送するヘッダーも転送しますが、指定されたヘッダーの値にのみ基づいてオブジェクトをキャッシュします。

  • デフォルトのヘッダーのみを転送する。この設定の場合、CloudFront は、リクエストヘッダーの値に基づいてオブジェクトをキャッシュすることはありません。

キャッシュ動作ごとに転送できるヘッダーの数に関する現在のクォータについて、またはクォータの引き上げをリクエストするには、「ヘッダーのクォータ」を参照してください。

CloudFront コンソールを使用して、CloudFront でヘッダーをオリジンに転送するようにディストリビューションを更新する方法については、「ディストリビューションを更新する」を参照してください。CloudFront API を使用して既存のディストリビューションを更新する方法については、Amazon CloudFront API リファレンスの「UpdateDistribution」を参照してください。

キャッシュ条件に使用するヘッダーを選択する

オリジンに転送できるヘッダーおよび、CloudFront がキャッシュ条件にするヘッダーは、オリジンが Amazon S3 バケットであるか、カスタムオリジンを使用しているかに応じて変わります。

  • Amazon S3 - 特定のヘッダーの数に基づいて、オブジェクトを転送し、キャッシュするように CloudFront を設定できます (以下の例外のリストを参照)。ただし、Cross-Origin Resource Sharing (CORS) を実装するか、オリジン側イベントで Lambda@Edge を使用してコンテンツをパーソナライズする必要がない限り、Amazon S3 オリジンを使用してヘッダーを転送しないようにすることをお勧めします。

    • CORS を設定するには、CloudFront に Cross-Origin Resource Sharing (CORS) が有効になっているウェブサイトのコンテンツの配信を許可するヘッダーを転送する必要があります。詳細については、「CORS 設定を適用するように CloudFront を設定する」を参照してください。

    • Amazon S3 オリジンに転送するヘッダーを使用してコンテンツをパーソナライズするには、Lambda@Edge 関数を記述および追加し、オリジン側イベントによってトリガーされる CloudFront ディストリビューションに関連付けます。ヘッダーの操作によるコンテンツのパーソナライズの詳細については、「国またはデバイスタイプヘッダー別のコンテンツのパーソナライズ - 例」を参照してください。

      使用していないヘッダーを転送してコンテンツをパーソナライズしないようにすることをお勧めします。追加のヘッダーを転送すると、キャッシュヒット率が低下する可能性があるためです。つまり、CloudFront はすべてのリクエストの比率として、エッジキャッシュからのすべてのリクエストに対応することができません。

  • カスタムオリジン - 以下を除く任意のリクエストヘッダーの値に基づいてキャッシュするように CloudFront を設定できます。

    • Connection

    • Cookie - Cookie に基づいて転送しキャッシュする場合は、ディストリビューションの別の設定を使用します。詳細については、「Cookie に基づいてコンテンツをキャッシュする」を参照してください。

    • Host (for Amazon S3 origins)

    • Proxy-Authorization

    • TE

    • Upgrade

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

すべての HTTP リクエストヘッダーの一覧と、CloudFront がそれを処理する方法については、「HTTP リクエストヘッダーと CloudFront の動作 (カスタムオリジンおよび Amazon S3 オリジン)」を参照してください。

CORS 設定を適用するように CloudFront を設定する

Cross-Origin Resource Sharing (CORS) を Amazon S3 バケットまたはカスタムオリジンで有効にしている場合、その CORS 設定を優先させるために、転送する特定のヘッダーを選択する必要があります。転送する必要があるヘッダーは、オリジン (Amazon S3 またはカスタム)、および OPTIONS レスポンスをキャッシュするかどうかによって異なります。

Amazon S3

  • OPTIONS レスポンスをキャッシュする場合は、次の操作を行います。

    • OPTIONS レスポンスのキャッシュを有効にする、デフォルトのキャッシュ動作設定のオプションを選択します。

    • OriginAccess-Control-Request-Headers、および Access-Control-Request-Method ヘッダーを転送するように CloudFront を設定します。

  • OPTIONS レスポンスをキャッシュしない場合は、オリジンに必要な他のヘッダー (OriginAccess-Control-Request-Headers など) と一緒に Access-Control-Request-Method ヘッダーを転送するように CloudFront を設定します。

カスタムオリジン - オリジンが必要とする他のヘッダーと共に、Origin ヘッダーを転送します。

CORS に基づいてレスポンスをキャッシュするように CloudFront を設定するには、キャッシュポリシーを使用してヘッダーを転送するように CloudFront を設定する必要があります。詳細については、「ポリシーを使用してキャッシュキーを制御する」を参照してください。

CORS と Amazon S3 の詳細については、Amazon Simple Storage Service ユーザーガイドの「Cross-Origin Resource Sharing (CORS) の使用」を参照してください。

デバイスタイプに基づいてキャッシュを設定する

ユーザーがコンテンツの表示に使用しているデバイスに基づいて、オブジェクトの異なるバージョンを CloudFront でキャッシュするには、該当するヘッダーをカスタムオリジンに転送するように 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 でキャッシュするには、Accept-Language ヘッダーをオリジンに転送するように CloudFront を設定します。

ビューワーの場所に基づいてキャッシュを設定する

リクエスト元の国に基づいて、オブジェクトの異なるバージョンを CloudFront でキャッシュするには、CloudFront-Viewer-Country ヘッダーをオリジンに転送するように CloudFront を設定します。CloudFront はリクエスト元の IP アドレスを 2 文字の国コードに自動的に変換します。コード順、国順に並べ替えることのできる使いやすい国コードの一覧については、Wikipedia の「ISO 3166-1 alpha-2」の項目を参照してください。

リクエストのプロトコルに基づいてキャッシュを設定する

リクエストのプロトコル (HTTP または HTTPS) に基づいて、オブジェクトの異なるバージョンを CloudFront でキャッシュするには、CloudFront-Forwarded-Proto ヘッダーをオリジンに転送するように CloudFront を設定します。

圧縮ファイルのキャッシュを設定する

オリジンが Brotli 圧縮をサポートしている場合は、Accept-Encoding ヘッダーに基づいてキャッシュできます。オリジンがヘッダーに基づいて異なるコンテンツを配信する場合のみ、Accept-Encoding に基づいてキャッシュを設定する必要があります。

ヘッダーに基づくキャッシュがパフォーマンスに及ぼす影響

ヘッダーに基づいてキャッシュするように CloudFront を設定した場合、ヘッダーで指定できる値が複数あると、CloudFront が同じオブジェクトについてオリジンサーバーに転送するリクエストの数が増えます。このためパフォーマンスが低下し、オリジンサーバーの負荷が増加します。所定のヘッダーの値に関係なくオリジンサーバーが同じオブジェクトを返す場合は、そのヘッダーに基づいてキャッシュするように CloudFront を設定しないことをお勧めします。

複数のヘッダーを転送するように CloudFront を設定した場合、ビューワーリクエストのヘッダーの順序は、値が同じである限り、キャッシュ動作には影響しません。例えば、あるリクエストのヘッダーが A:1、B:2 で、別のリクエストのヘッダーが B:2、A:1 である場合、CloudFront はそのオブジェクトのコピーを 1 つだけキャッシュします。

ヘッダーとヘッダー値の大文字小文字がキャッシュに及ぼす影響

CloudFront がヘッダー値に基づいてキャッシュする場合、ヘッダー名の大文字小文字の違いは無視されますが、ヘッダー値の大文字小文字の違いは考慮されます。

  • ビューワーリクエストが Product:Acmeproduct:Acme の両方を含む場合、CloudFront がオブジェクトをキャッシュするのは 1 回だけです。両者の違いはヘッダー名の大文字小文字だけで、これはキャッシュ動作に影響しません。

  • ビューワーリクエストが Product:AcmeProduct:acme の両方を含む場合、CloudFront はオブジェクトを 2 回キャッシュします。値が、あるリクエストでは Acme、別のリクエストでは acme と異なっているためです。

CloudFront がビューワーに返すヘッダー

ヘッダーを転送およびキャッシュするように CloudFront を設定しても、CloudFront がビューワーに返すヘッダーには影響しません。CloudFront は、いくつかの例外を除いて、オリジンから取得したヘッダーをすべて返します。詳細については、該当するトピックを参照してください。