

# CloudFront キャッシュから直接提供するリクエストの割合 (キャッシュヒット率) を増やす
<a name="cache-hit-ratio"></a>

コンテンツのオリジンサーバーにアクセスするのではなく、CloudFront キャッシュから直接提供されるビューワーリクエストの比率を増やしてパフォーマンスを向上させることができます。これは、キャッシュヒット率の向上として知られています。

以下のセクションでは、キャッシュヒット率を改善する方法について説明します。

**Topics**
+ [CloudFront がオブジェクトをキャッシュする期間を指定する](#cache-hit-ratio-duration)
+ [オリジンシールドを使用する](#cache-hit-ratio-use-origin-shield)
+ [クエリ文字列パラメータに基づくキャッシュ](#cache-hit-ratio-query-string-parameters)
+ [Cookie 値に基づくキャッシュ](#cache-hit-ratio-cookies)
+ [リクエストヘッダーに基づくキャッシュ](#cache-hit-ratio-request-headers)
+ [圧縮が不要な場合に `Accept-Encoding` ヘッダーを削除する](#cache-hit-ratio-remove-accept-encoding)
+ [HTTP 経由でメディアコンテンツを提供する](#cache-hit-ratio-http-streaming)

## CloudFront がオブジェクトをキャッシュする期間を指定する
<a name="cache-hit-ratio-duration"></a>

キャッシュヒット率を向上させるには、[Cache-Control max-age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) ディレクティブをオブジェクトに追加し、`max-age` に対して最も長い実用的な値を指定するようにオリジンを設定します。キャッシュ期間が短ければ短いほど、オブジェクトが変更されているかどうかを特定して最新バージョンを取得するリクエストを CloudFront がオリジンに送信する頻度が高くなります。`stale-while-revalidate` および `stale-if-error` ディレクティブで `max-age` を補足すると、特定の条件下でのキャッシュヒット率をさらに向上させることができます。詳細については、「[コンテンツをキャッシュに保持する期間 (有効期限) を管理する](Expiration.md)」を参照してください。

## オリジンシールドを使用する
<a name="cache-hit-ratio-use-origin-shield"></a>

CloudFront Origin Shield は、オリジンの前に追加のキャッシュレイヤーを提供するため、CloudFront ディストリビューションのキャッシュヒット率を向上させるために役立ちます。Origin Shield を使用すると、CloudFront のすべてのキャッシュレイヤーからオリジンへのすべてのリクエストは、1 つの場所から送信されます。CloudFront は、各オブジェクトを Origin Shield からオリジンへの 1 つのリクエストを使用して取得できます。CloudFront キャッシュの他のすべてのレイヤー (エッジロケーションと[リージョン別エッジキャッシュ](HowCloudFrontWorks.md#CloudFrontRegionaledgecaches)) は、OriginShield からオブジェクトを取得できます。

詳細については、「[Amazon CloudFront Origin Shield の使用](origin-shield.md)」を参照してください。

## クエリ文字列パラメータに基づくキャッシュ
<a name="cache-hit-ratio-query-string-parameters"></a>

クエリ文字列パラメータに基づいてキャッシュするように CloudFront を設定する場合、以下を行うことでキャッシュを改善できます。
+ オリジンが一意のオブジェクトを返すクエリ文字列パラメータのみを転送するように CloudFront を設定する。
+ 同じパラメータのすべてのインスタンスで大文字と小文字の区別を統一する。例えば、1 つのリクエストに `parameter1=A` が含まれており、別のリクエストに `parameter1=a` が含まれている場合、CloudFront は `parameter1=A` が含まれているリクエストと `parameter1=a` が含まれているリクエストを 2 つの個別のリクエストとしてオリジンに転送します。これが行われると、オブジェクトは同一であっても、CloudFront はオリジンから個別に返された対応するオブジェクトを個別にキャッシュします。`A` または `a` のどちらかのみを使用すると、CloudFront がオリジンに転送するリクエストが少なくなります。
+ パラメータの順序を統一する。大文字と小文字が区別されることと同じように、あるオブジェクトに対するリクエストに `parameter1=a&parameter2=b` というクエリ文字列が含まれており、同じオブジェクトに対する別のリクエストに `parameter2=b&parameter1=a` が含まれている場合、オブジェクトは同一であっても、CloudFront は両方のリクエストをオリジンに転送し、対応するオブジェクトを個別にキャッシュします。パラメータの順序を統一すると、CloudFront がオリジンに転送するリクエストが少なくなります。

詳細については、「[クエリ文字列パラメータに基づいてコンテンツをキャッシュする](QueryStringParameters.md)」を参照してください。CloudFront がオリジンに転送するクエリ文字列を確認するには、CloudFront ログファイルの `cs-uri-query` 列の値を参照します。詳細については、「[アクセスログ (標準ログ)](AccessLogs.md)」を参照してください。

## Cookie 値に基づくキャッシュ
<a name="cache-hit-ratio-cookies"></a>

Cookie 値に基づいてキャッシュするように CloudFront を設定する場合、以下を行うことでキャッシュを改善できます。
+ すべての Cookie を転送する代わりに特定の Cookie のみを転送するように CloudFront を設定する。Cookie をオリジンに転送するように CloudFront を設定する場合、CloudFront は Cookie の名前と値のすべての組み合わせを転送します。その場合、オリジンが返すオブジェクトがすべて同一であっても、別々にキャッシュされます。

  たとえば、ビューワーがすべてのリクエストに 2 つの Cookie を含め、それぞれの Cookie に使用できる値が 3 つあり、Cookie 値のすべての組み合わせが可能であるとします。CloudFront は、オブジェクトごとに最大 9 つの異なるリクエストをオリジンに転送します。オリジンが 1 つの Cookie のみに基づいて同じオブジェクトの複数のバージョンを返す場合、CloudFront は必要以上のリクエストをオリジンに転送し、同一オブジェクトの複数のバージョンを不必要にキャッシュします。
+ 静的コンテンツと動的コンテンツに対してそれぞれ異なるキャッシュ動作を作成し、動的コンテンツの場合にのみ Cookie をオリジンに転送するように CloudFront を設定する。

  例えば、ディストリビューションのキャッシュ動作が 1 つしかなく、このディストリビューションを `.js` ファイルなどの動的コンテンツと頻繁に変更されない `.css` ファイルの両方に使用するとします。CloudFront は Cookie 値に基づいて個別のバージョンの `.css` ファイルをキャッシュするため、それぞれの CloudFront エッジロケーションがすべての新しい Cookie 値または Cookie 値の組み合わせに対してリクエストをオリジンに転送します。

  Cookie 値に基づいて CloudFront がキャッシュしない、`*.css` というパスパターンのキャッシュ動作を作成すると、CloudFront は、エッジロケーションが特定の `.css` ファイルに対して受け取る最初のリクエストおよび `.css` ファイルの有効期限が切れた後の最初のリクエストでのみ `.css` ファイルのリクエストをオリジンに転送します。
+ Cookie 値がユーザーごとに一意である (ユーザー ID など) 動的コンテンツと、より少ない数の一意の値に基づいて変化する動的コンテンツに対してそれぞれ異なるキャッシュ動作を作成する (可能な場合)。

詳細については、「[Cookie に基づいてコンテンツをキャッシュする](Cookies.md)」を参照してください。CloudFront がオリジンに転送する Cookie を確認するには、CloudFront ログファイルの `cs(Cookie)` 列の値を参照します。詳細については、「[アクセスログ (標準ログ)](AccessLogs.md)」を参照してください。

## リクエストヘッダーに基づくキャッシュ
<a name="cache-hit-ratio-request-headers"></a>

リクエストヘッダーに基づいてキャッシュするように CloudFront を設定する場合、以下を行うことでキャッシュを改善できます。
+ すべてのヘッダーに基づいて転送およびキャッシュする代わりに特定のヘッダーのみに基づいて転送およびキャッシュするように CloudFront を設定します。CloudFront は、指定したヘッダーの名前と値のすべての組み合わせを転送します。その場合、オリジンが返すオブジェクトがすべて同一であっても、別々にキャッシュされます。
**注記**  
CloudFront は常に以下のトピックで指定されているヘッダーをオリジンに転送します。  
CloudFront がリクエストを処理して Amazon S3 オリジンサーバーに転送する方法 > [CloudFront が削除または更新する HTTP リクエストヘッダー](RequestAndResponseBehaviorS3Origin.md#request-s3-removed-headers)
CloudFront がリクエストを処理してカスタムオリジンサーバーに転送する方法 > [HTTP リクエストヘッダーと CloudFront の動作 (カスタムオリジンおよび Amazon S3 オリジン)](RequestAndResponseBehaviorCustomOrigin.md#request-custom-headers-behavior)

  リクエストヘッダーに基づいてキャッシュするように CloudFront を設定する場合、CloudFront が転送するヘッダーを変更するのではなく、CloudFront がヘッダー値に基づいてオブジェクトをキャッシュするかどうかのみを変更します。
+ 多数の一意の値を持つリクエストヘッダーに基づいてキャッシュすることを可能な限り回避する。

  例えば、ユーザーのデバイスに基づいてさまざまなサイズのイメージを提供する場合、使用できる値が多数ある `User-Agent` ヘッダーに基づいてキャッシュするように CloudFront を設定しないでください。代わりに、CloudFront デバイスタイプヘッダー `CloudFront-Is-Desktop-Viewer`、`CloudFront-Is-Mobile-Viewer`、`CloudFront-Is-SmartTV-Viewer`、`CloudFront-Is-Tablet-Viewer` に基づいてキャッシュするように CloudFront を設定します。さらに、タブレットとデスクトップに同じバージョンのイメージを返す場合は、`CloudFront-Is-Tablet-Viewer` ヘッダーではなく `CloudFront-Is-Desktop-Viewer` ヘッダーのみを転送します。

詳細については、「[リクエストヘッダーに基づいてコンテンツをキャッシュする](header-caching.md)」を参照してください。

## 圧縮が不要な場合に `Accept-Encoding` ヘッダーを削除する
<a name="cache-hit-ratio-remove-accept-encoding"></a>

圧縮が有効になっていない場合 (オリジンがサポートしていないため、CloudFront がサポートしていないため、またはコンテンツが圧縮可能でないため)、Custom Origin Header を以下のように設定するオリジンにディストリビューション内のキャッシュ動作を関連付けることで、キャッシュヒット率を増やすことができます。
+ **ヘッダー名**: `Accept-Encoding`
+ **ヘッダー値**: (空白のままにする)

この設定を使用すると、CloudFront はキャッシュキーから `Accept-Encoding` ヘッダーを削除し、オリジンリクエストにヘッダーを含めません。この設定は、そのオリジンからのディストリビューションに CloudFront が配信するすべてのコンテンツに適用されます。

## HTTP 経由でメディアコンテンツを提供する
<a name="cache-hit-ratio-http-streaming"></a>

ビデオオンデマンド (VOD) およびビデオコンテンツのストリーミングの最適化の詳細については、「[CloudFront を使用したビデオオンデマンドおよびライブストリーミングビデオ](on-demand-streaming-video.md)」を参照してください。