CloudFront がオリジンからの HTTP 4xx および 5xx ステータスコードを処理する方法 - Amazon CloudFront

CloudFront がオリジンからの HTTP 4xx および 5xx ステータスコードを処理する方法

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 はキャッシュされたコンテンツを引き続き提供します。詳細については、「使用できないオリジン」を参照してください。

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

CloudFront から返されるエラーメッセージに関連する機能とオプションの詳細については、以下を参照してください。

カスタムエラーページが設定されている場合に CloudFront がエラーを処理する方法

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

リクエストされたオブジェクトがエッジキャッシュにない場合

CloudFront は、以下のすべてが該当する場合に、オリジンからリクエストされたオブジェクトの取得を試行し続けます。

  • ビューワーがオブジェクトを要求する

  • オブジェクトがエッジキャッシュにない

  • オリジンが HTTP 4xx または 5xx ステータスコードを返して、以下のいずれかに該当する:

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

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

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

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

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

  5. CloudFront は、リクエストを送信したビューワーにカスタムエラーページを返します。また、最大で次の値になるようにカスタムエラーページをキャッシュします。

    • エラーキャッシュ最小 TTL で指定された時間の長さ (デフォルトでは 10 秒)

    • Cache-Control max-age ヘッダー、または最初のリクエストがエラーを生成したときに発信元から返された Cache-Control s-maxage ヘッダーで指定された時間

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

リクエストされたオブジェクトがエッジキャッシュにある場合

CloudFront は、以下のすべてに該当する場合に、現在エッジキャッシュに存在するオブジェクトを引き続き提供します。

  • ビューワーがオブジェクトを要求する

  • オブジェクトがエッジキャッシュに存在するが有効期限が切れている

  • オリジンがステータスコード 304 (変更なし) またはオブジェクトの更新バージョンを返す代わりに HTTP 5xx ステータスコードを返す

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

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

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

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

カスタムエラーページが設定されていない場合に CloudFront がエラーを処理する方法

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

リクエストされたオブジェクトがエッジキャッシュにない場合

CloudFront は、以下のすべてが該当する場合に、オリジンからリクエストされたオブジェクトの取得を試行し続けます。

  • ビューワーがオブジェクトを要求する

  • オブジェクトがエッジキャッシュにない

  • オリジンが HTTP 4xx または 5xx ステータスコードを返して、以下のいずれかに該当する:

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

  1. CloudFront は 4xx または 5xx のステータスコードをビューワーに返します。また、次の最大値のリクエストを受け取ったエッジキャッシュにステータスコードをキャッシュします。

    • エラーキャッシュ最小 TTL で指定された時間の長さ (デフォルトでは 10 秒)

    • Cache-Control max-age ヘッダー、または最初のリクエストがエラーを生成したときに発信元から返された Cache-Control s-maxage ヘッダーで指定された時間

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

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

リクエストされたオブジェクトがエッジキャッシュにある場合

CloudFront は、以下のすべてに該当する場合に、現在エッジキャッシュに存在するオブジェクトを引き続き提供します。

  • ビューワーがオブジェクトを要求する

  • オブジェクトがエッジキャッシュに存在するが有効期限が切れている

  • オリジンがステータスコード 304 (変更なし) またはオブジェクトの更新バージョンを返す代わりに HTTP 5xx ステータスコードを返す

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

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

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

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

CloudFront がキャッシュする HTTP 4xx および 5xx ステータスコード

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

CloudFront が常にキャッシュする HTTP 4xx および 5xx ステータスコード

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

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

400

Bad Request

403

Forbidden

405

Method Not Allowed

412¹

Precondition Failed

415¹

Unsupported Media Type

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