

# CloudFront がオリジンからの HTTP 4xx および 5xx ステータスコードを処理する方法
<a name="HTTPStatusCodes"></a>

CloudFront が Amazon S3 バケットまたはカスタムオリジンサーバーのオブジェクトをリクエストすると、オリジンサーバーは HTTP 4xx または 5xx ステータスコードを返すことがあります。このステータスコードは、エラーが発生したことを示します。CloudFront の動作は、以下の条件によって左右されます。
+ カスタムエラーページを設定しているかどうか
+ オリジンからのエラーレスポンスを CloudFront がキャッシュする期間 (エラーキャッシュの最小 TTL) を設定しているかどうか
+ ステータスコード
+ 5xx ステータスコードの場合、リクエストされたオブジェクトが現在 CloudFront エッジキャッシュにあるかどうか
+ 一部の 4xx ステータスコードの場合、オリジンが `Cache-Control max-age` または `Cache-Control s-maxage` ヘッダーを返すかどうか

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

オリジンが応答しない場合、オリジンへの CloudFront リクエストはタイムアウトし、オリジンからの HTTP 5xx エラーと見なされます。これは、オリジンからそのエラーが返されなくても同様です。そのシナリオでは、CloudFront はキャッシュされたコンテンツを引き続き提供します。詳細については、「[使用できないオリジン](RequestAndResponseBehaviorCustomOrigin.md#ResponseCustomOriginUnavailable)」を参照してください。

ログ作成を有効にしている場合、CloudFront は、HTTP ステータスコードに関係なく結果をログに書き込みます。

CloudFront から返されるエラーメッセージに関連する機能とオプションの詳細については、以下を参照してください。
+ CloudFront コンソールでのカスタムエラーページの設定の詳細については、「[カスタムエラーページとエラーキャッシュ](DownloadDistValuesErrorPages.md)」を参照してください。
+ CloudFront コンソールでのエラーキャッシュ最小 TTL の詳細については、「[Error caching minimum TTL (seconds) (エラーキャッシュ最小 TTL (秒))](DownloadDistValuesErrorPages.md#DownloadDistValuesErrorCachingMinTTL)」を参照してください。
+ CloudFront がキャッシュする HTTP ステータスコードのリストについては、「[CloudFront がキャッシュする HTTP 4xx および 5xx ステータスコード](#HTTPStatusCodes-cached-errors)」を参照してください。

**Topics**
+ [カスタムエラーページが設定されている場合に CloudFront がエラーを処理する方法](#HTTPStatusCodes-custom-error-pages)
+ [カスタムエラーページが設定されていない場合に CloudFront がエラーを処理する方法](#HTTPStatusCodes-no-custom-error-pages)
+ [CloudFront がキャッシュする HTTP 4xx および 5xx ステータスコード](#HTTPStatusCodes-cached-errors)

## カスタムエラーページが設定されている場合に CloudFront がエラーを処理する方法
<a name="HTTPStatusCodes-custom-error-pages"></a>

カスタムエラーページを設定している場合、CloudFront の動作は、リクエストされたオブジェクトがエッジキャッシュにあるかどうかによって異なります。

### リクエストされたオブジェクトがエッジキャッシュにない場合
<a name="HTTPStatusCodes-custom-error-pages-not-in-cache"></a>

CloudFront は、以下のすべてが該当する場合に、オリジンからリクエストされたオブジェクトの取得を試行し続けます。
+ ビューワーがオブジェクトを要求する
+ オブジェクトがエッジキャッシュにない
+ オリジンが HTTP 4xx または 5xx ステータスコードを返して、以下のいずれかに該当する:
  + オリジンがステータスコード 304 (変更なし) またはオブジェクトの更新バージョンを返す代わりに HTTP 5xx ステータスコードを返す
  + オリジンが、キャッシュコントロールヘッダーによって制限されておらず、以下のステータスコードのリストに含まれている HTTP 4xx ステータスコードを返す: [CloudFront がキャッシュする HTTP 4xx および 5xx ステータスコード](#HTTPStatusCodes-cached-errors)。
  + オリジンが `Cache-Control max-age` ヘッダーまたは `Cache-Control s-maxage` ヘッダーで HTTP 4xx ステータスコードを返す。ステータスコードは、次のステータスコードの一覧に含まれる: コントロール [CloudFront が `Cache-Control` ヘッダーに基づいてキャッシュする HTTP 4xx ステータスコード](#HTTPStatusCodes-cached-errors-with-cache-control)。

**CloudFront は以下の処理を行います。**

1. ビューワーからリクエストを受け取った CloudFront エッジキャッシュで、CloudFront はディストリビューション設定を確認し、オリジンから返されたステータスコードに対応するカスタムエラーページのパスを取得します。

1. CloudFront は、カスタムエラーページのパスと一致するパスパターンを持つ、ディストリビューション内の最初のキャッシュ動作を検索します。

1. CloudFront エッジロケーションは、キャッシュ動作に指定されているオリジンに、カスタムエラーページのリクエストを送信します。

1. オリジンはカスタムエラーページをエッジロケーションに返します。

1. CloudFront は、リクエストを送信したビューワーにカスタムエラーページを返します。また、最大で次の値になるようにカスタムエラーページをキャッシュします。
   + エラーキャッシュ最小 TTL で指定された時間の長さ (デフォルトでは 10 秒)
   + `Cache-Control max-age` ヘッダー、または最初のリクエストがエラーを生成したときに発信元から返された `Cache-Control s-maxage` ヘッダーで指定された時間

1. キャッシュ時間 (ステップ 5 で決定されます) が経過すると、CloudFront はオリジンに別のリクエストを転送して、リクエストされたオブジェクトの取得を再試行します。CloudFront は、エラーキャッシュ最小 TTL に指定された間隔で再試行し続けます。

**注記**  
同じカスタムエラーページにキャッシュ動作も設定した場合、CloudFront は代わりにキャッシュ動作 TTL を使用します。この場合、CloudFront はステップ 5 と 6 で以下を実行します。  
CloudFront がリクエストを行ったビューワーにカスタムエラーページを返した後、CloudFront はキャッシュ動作 TTL をチェックします (例えば、デフォルトの TTL を 5 秒に設定した場合)。その後、CloudFront はカスタムエラーページをその最大値までキャッシュします。
5 秒経過すると、CloudFront はオリジンからカスタムエラーページを再度取得します。CloudFront は、キャッシュ動作 TTL に指定された間隔で再試行し続けます。
詳細については、「キャッシュ動作 [TTL 設定](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMinTTL)」を参照してください。

### リクエストされたオブジェクトがエッジキャッシュにある場合
<a name="HTTPStatusCodes-custom-error-pages-in-cache"></a>

CloudFront は、以下のすべてに該当する場合に、現在エッジキャッシュに存在するオブジェクトを引き続き提供します。
+ ビューワーがオブジェクトを要求する
+ オブジェクトがエッジキャッシュに存在するが有効期限が切れている
+ オリジンがステータスコード 304 (変更なし) またはオブジェクトの更新バージョンを返す代わりに HTTP 5xx ステータスコードを返す

**CloudFront は以下の処理を行います。**

1. オリジンが 5xx ステータスコードを返した場合、CloudFront はオブジェクトの有効期限が切れていても、そのオブジェクトを返します。エラーキャッシュ最小 TTL の期間、CloudFront は、エッジキャッシュからオブジェクトを提供することで、ビューワーリクエストに対して応答し続けます。

   オリジンが 4xx ステータスコードを返した場合、CloudFront はリクエストされたオブジェクトではなく、ステータスコードをビューワーに返します。

1. エラーキャッシュ最小 TTL が経過すると、CloudFront はオリジンに別のリクエストを転送して、リクエストされたオブジェクトの取得を再試行します。オブジェクトが頻繁にリクエストされない場合、CloudFront はそのオブジェクトをエッジキャッシュから削除することがありますが、オリジンサーバーは引き続き 5xx レスポンスを返します。オブジェクトが CloudFront エッジキャッシュに保持される期間については、「[コンテンツをキャッシュに保持する期間 (有効期限) を管理する](Expiration.md)」を参照してください。

## カスタムエラーページが設定されていない場合に CloudFront がエラーを処理する方法
<a name="HTTPStatusCodes-no-custom-error-pages"></a>

カスタムエラーページを設定していない場合、CloudFront の動作は、リクエストされたオブジェクトがエッジキャッシュにあるかどうかによって異なります。

**Topics**
+ [リクエストされたオブジェクトがエッジキャッシュにない場合](#HTTPStatusCodes-no-custom-error-pages-not-in-cache)
+ [リクエストされたオブジェクトがエッジキャッシュにある場合](#HTTPStatusCodes-no-custom-error-pages-in-cache)

### リクエストされたオブジェクトがエッジキャッシュにない場合
<a name="HTTPStatusCodes-no-custom-error-pages-not-in-cache"></a>

CloudFront は、以下のすべてが該当する場合に、オリジンからリクエストされたオブジェクトの取得を試行し続けます。
+ ビューワーがオブジェクトを要求する
+ オブジェクトがエッジキャッシュにない
+ オリジンが HTTP 4xx または 5xx ステータスコードを返して、以下のいずれかに該当する:
  + オリジンがステータスコード 304 (変更なし) またはオブジェクトの更新バージョンを返す代わりに HTTP 5xx ステータスコードを返す
  + オリジンがキャッシュコントロールヘッダーによって制限されておらず、以下のステータスコードのリストに含まれている HTTP 4xx ステータスコードを返す: [CloudFront がキャッシュする HTTP 4xx および 5xx ステータスコード](#HTTPStatusCodes-cached-errors)。
  + オリジンが `Cache-Control max-age` ヘッダーまたは `Cache-Control s-maxage` ヘッダーで HTTP 4xx ステータスコードを返す。ステータスコードは、次のステータスコードの一覧に含まれる: コントロール [CloudFront が `Cache-Control` ヘッダーに基づいてキャッシュする HTTP 4xx ステータスコード](#HTTPStatusCodes-cached-errors-with-cache-control)。

CloudFront は以下の処理を行います。

1. CloudFront は 4xx または 5xx のステータスコードをビューワーに返します。また、次の最大値のリクエストを受け取ったエッジキャッシュにステータスコードをキャッシュします。
   + エラーキャッシュ最小 TTL で指定された時間の長さ (デフォルトでは 10 秒)
   + `Cache-Control max-age` ヘッダー、または最初のリクエストがエラーを生成したときに発信元から返された `Cache-Control s-maxage` ヘッダーで指定された時間

1. キャッシュ時間の期間 (ステップ 1 で決定されます) では、CloudFront はキャッシュされた 4xx または 5xx のステータスコードを使用して、同じオブジェクトに対する後続のビューワーリクエストに応答します。

1. キャッシュ時間 (ステップ 1 で決定されます) が経過すると、CloudFront はオリジンに別のリクエストを転送して、リクエストされたオブジェクトの取得を再試行します。CloudFront は、エラーキャッシュ最小 TTL に指定された間隔で再試行し続けます。

### リクエストされたオブジェクトがエッジキャッシュにある場合
<a name="HTTPStatusCodes-no-custom-error-pages-in-cache"></a>

CloudFront は、以下のすべてに該当する場合に、現在エッジキャッシュに存在するオブジェクトを引き続き提供します。
+ ビューワーがオブジェクトを要求する
+ オブジェクトがエッジキャッシュに存在するが有効期限が切れている これは、オブジェクトが*古く*なっていることを意味します。
+ オリジンがステータスコード 304 (変更なし) またはオブジェクトの更新バージョンを返す代わりに HTTP 5xx ステータスコードを返す

CloudFront は以下の処理を行います。

1. オリジンが 5xx のエラーコードを返した場合、CloudFront は、オブジェクトの有効期限が切れていても、そのオブジェクトを返します。エラーキャッシュ最小 TTL 時間 (デフォルトでは 10 秒) の間、CloudFront は、エッジキャッシュからオブジェクトを提供することで、ビューワーからのリクエストに応答し続けます。

   オリジンが 4xx ステータスコードを返した場合、CloudFront はリクエストされたオブジェクトではなく、ステータスコードをビューワーに返します。

1. エラーキャッシュ最小 TTL が経過すると、CloudFront はオリジンに別のリクエストを転送して、リクエストされたオブジェクトの取得を再試行します。オブジェクトが頻繁にリクエストされていない場合、オリジンサーバーがまだ 5xx レスポンスを返している間に、CloudFront がエッジキャッシュからオブジェクトを削除することがあります。詳細については、「[コンテンツをキャッシュに保持する期間 (有効期限) を管理する](Expiration.md)」を参照してください。

**ヒント**  
`stale-if-error` または `Stale-While-Revalidate` ディレクティブを設定する場合は、古いオブジェクトをエッジキャッシュで使用できる期間を指定できます。これにより、オリジンが使用できない場合でも、ビューワーにコンテンツを提供し続けることができます。詳細については、「[古い (期限切れの) コンテンツを提供する](Expiration.md#stale-content)」を参照してください。
CloudFront は、指定された[最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 値まで古いオブジェクトのみを提供します。この期間を過ぎると、オブジェクトはエッジキャッシュから使用できなくなります。

## CloudFront がキャッシュする HTTP 4xx および 5xx ステータスコード
<a name="HTTPStatusCodes-cached-errors"></a>

CloudFront は、返された特定のステータスコードと、オリジンがレスポンスで特定のヘッダーを返すかどうかに応じて、オリジンから返された HTTP 4xx と 5xx ステータスコードをキャッシュします。

CloudFront は、オリジンから返される以下の HTTP 4xx および 5xx ステータスコードを常にキャッシュします。HTTP ステータスコードのカスタムエラーページを設定している場合、CloudFront はカスタムエラーページをキャッシュします。

**注記**  
[CachingDisabled](using-managed-cache-policies.md#managed-cache-policy-caching-disabled) マネージドキャッシュポリシーを仕様している場合、CloudFront はこのようなステータスコードやカスタムエラーページをキャッシュしません。


|  |  | 
| --- |--- |
|  404  |  Not Found  | 
|  414  |  Request-URI Too Large  | 
|  500  |  Internal Server Error  | 
|  501  |  Not Implemented  | 
|  502  |  Bad Gateway  | 
|  503  |  Service Unavailable  | 
|  504  |  Gateway Time-out  | 

### CloudFront が `Cache-Control` ヘッダーに基づいてキャッシュする HTTP 4xx ステータスコード
<a name="HTTPStatusCodes-cached-errors-with-cache-control"></a>

オリジンが `Cache-Control max-age` または `Cache-Control s-maxage` ヘッダーを返す場合、CloudFront は以下の HTTP 4 xx ステータスコードのみをキャッシュします。これらの HTTP ステータスコードのいずれかについてカスタムエラーページを設定しており、オリジンがキャッシュコントロールヘッダーのいずれかを返す場合、CloudFront はカスタムエラーページをキャッシュします。


|  |  | 
| --- |--- |
|  400  |  Bad Request  | 
|  403  |  Forbidden  | 
|  405  |  Method Not Allowed  | 
|  412¹  |  Precondition Failed  | 
|  415¹  |  Unsupported Media Type  | 

¹CloudFront は、これらの HTTP ステータスコードに対するカスタムエラーページの作成をサポートしていません。