リクエストルーティング - Amazon Simple Storage Service

リクエストルーティング

<CreateBucketConfiguration> API を使用して作成されたバケットに対してリクエストを行うプログラムは、リダイレクトをサポートしている必要があります。また、DNS TTL に従わない一部のクライアントで問題が発生する場合があります。

このセクションでは、Amazon S3 で使用するサービスまたはアプリケーションを設計するときに考慮すべきルーティングおよび DNS の問題について説明します。

リクエストのリダイレクトと REST API

Amazon S3 はドメインネームシステム (DNS) を使用して、リクエストを処理できる施設にルーティングします。このシステムは有効に機能しますが、一時的なルーティングエラーが発生する場合があります。リクエストが誤った Amazon S3 ロケーションに到達した場合、Amazon S3 は、リクエストを新しいエンドポイントに再送するようリクエスタに指示する一時的なリダイレクトで応答します。リクエストの形式が正しくない場合、Amazon S3 は恒久的なリダイレクトを使用して、リクエストを正しく実行する方法について指示します。

重要

この機能を使用するには、Amazon S3 リダイレクトレスポンスを処理できるアプリケーションが必要です。唯一の例外は、<CreateBucketConfiguration> なしで作成されたバケットのみを使用するアプリケーションです。ロケーションの制約の詳細については、「バケットへのアクセス方法」を参照してください。

2019 年 3 月 20 日より後に開始されたすべてのリージョンで、リクエストが間違った Amazon S3 ロケーションに到着した場合、Amazon S3 は HTTP 400 Bad Request エラーを返します。

AWS リージョン の有効化または無効化の詳細については、AWS 全般のリファレンスの「 AWS リージョン とエンドポイント」を参照してください。

DNS ルーティング

DNS ルーティングは、リクエストを適切な Amazon S3 施設にルーティングします。以下の図とステップは、DNS ルーティングの例を示しています。


				DNS サーバーでクライアントから施設 B にリクエストをルーティングするときのステップを示す図です。

DNS ルーティングリクエストのステップ

  1. クライアントが、Amazon S3 に保存されているオブジェクトを取得するために DNS リクエストを行います。

  2. クライアントが、リクエストを処理できる施設の 1 つまたは複数の IP アドレスを受け取ります。この例で、IP アドレスは施設 B のものです。

  3. クライアントが、Amazon S3 施設 B へのリクエストを行います。

  4. 施設 B が、オブジェクトのコピーをクライアントに返します。

一時的なリクエストのリダイレクト

一時的なリダイレクトとは、リクエストを異なるエンドポイントに再送する必要があることをリクエスタに知らせる一種のエラーレスポンスです。Amazon S3 が持つ分散型の特質により、リクエストが誤った施設に一時的にルーティングされる場合があります。このエラーは、大半の場合にバケットが作成または削除された直後に発生します。

たとえば、新しいバケットを作成し、ただちにバケットへのリクエストを実行する場合、バケットのロケーションの制約によっては一時的にリダイレクトされる可能性もあります。 AWS リージョン の米国東部 (バージニア北部) にバケットを作成した場合、これはデフォルトの Amazon S3 エンドポイントでもあるため、そのバケットへのリクエストはリダイレクトされることはありません。

一方、その他のリージョンにバケットを作成した場合、バケットの DNS エントリは伝播されますが、バケットに対するリクエストはデフォルトのエンドポイントに転送されます。デフォルトのエンドポイントは、リクエストを正しいエンドポイントにリダイレクトし、HTTP 302 レスポンスを返します。一時的なリダイレクトには正しい施設への URI が含まれており、これを使用して直ちにリクエストを再送できます。

重要

以前のリダイレクトレスポンスで返されたエンドポイントを再利用しないでください。このようなエンドポイントは (長期的にも) 機能するように見えますが、予期しない結果を招くことがあり、最終的には通知なしに失敗します。

以下の図とステップは、一時的なリダイレクトの例を示しています。


				クライアントから B に送信したリクエストが C にリダイレクトされるステップを示す図です。

一時的なリクエストのリダイレクトのステップ

  1. クライアントが、Amazon S3 に保存されているオブジェクトを取得するために DNS リクエストを行います。

  2. クライアントが、リクエストを処理できる施設の 1 つまたは複数の IP アドレスを受け取ります。

  3. クライアントが、Amazon S3 施設 B へのリクエストを行います。

  4. 施設 B がリダイレクトを返して、オブジェクトがロケーション C から利用可能であることを示します。

  5. クライアントがリクエストを施設 C に再送します。

  6. 施設 C がオブジェクトのコピーを返します。

永続的なリクエストのリダイレクト

恒久的なリダイレクトは、リクエストがリソースのアドレス指定を不適切に行ったことを示します。たとえば、パス形式のリクエストを使用して、<CreateBucketConfiguration> によって作成されたバケットにアクセスした場合、恒久的なリダイレクトが発生します。詳細については、「バケットへのアクセス方法」を参照してください。

開発中にこれらのエラーを見つけやすいように、このタイプのリダイレクトには、リクエストを正しいロケーションに自動的に送信するためのロケーション HTTP ヘッダーが含まれていません。正しい Amazon S3 エンドポイントを使用するために、生成される XML エラードキュメントを参照してください。

リクエストのリダイレクトの例

一時的なリクエストのリダイレクトレスポンスの例を以下に示します。

REST API の一時的なリダイレクトレスポンス

HTTP/1.1 307 Temporary Redirect Location: http://awsexamplebucket1.s3-gztb4pa9sq.amazonaws.com/photos/puppy.jpg?rk=e2c69a31 Content-Type: application/xml Transfer-Encoding: chunked Date: Fri, 12 Oct 2007 01:12:56 GMT Server: AmazonS3 <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>TemporaryRedirect</Code> <Message>Please re-send this request to the specified temporary endpoint. Continue to use the original request endpoint for future requests.</Message> <Endpoint>awsexamplebucket1.s3-gztb4pa9sq.amazonaws.com</Endpoint> </Error>

SOAP API の一時的なリダイレクトレスポンス

注記

SOAP のサポートは HTTP 経由では廃止されましたが、HTTPS 経由では引き続き利用可能です。SOAP では、Amazon S3 の新機能がサポートされなくなります。REST API か AWS SDK を使用することをお勧めします。

<soapenv:Body> <soapenv:Fault> <Faultcode>soapenv:Client.TemporaryRedirect</Faultcode> <Faultstring>Please re-send this request to the specified temporary endpoint. Continue to use the original request endpoint for future requests.</Faultstring> <Detail> <Bucket>images</Bucket> <Endpoint>s3-gztb4pa9sq.amazonaws.com</Endpoint> </Detail> </soapenv:Fault> </soapenv:Body>

DNS に関する考慮事項

Amazon S3 の設計要件の 1 つは、非常に高い可用性です。この要件を満たす方法の 1 つとして、DNS 内の Amazon S3 エンドポイントに関連付られた IP アドレスを必要に応じて更新します。これらの変更は、存続時間の短いクライアントには自動的に反映されますが、存続時間の長いクライアントには反映されない場合があります。存続時間の長いクライアントの場合、これらの変更を活用するには、Amazon S3 エンドポイントを定期的に再解決するための特殊なアクションを実行する必要があります。仮想マシン (VM) の詳細については、次のトピックを参照してください。

  • Java の場合、Sun の JVM はデフォルトで DNS ルックアップを永続的にキャッシュします。この動作を変更する方法については、InetAddress のドキュメントの「InetAddress キャッシング」セクションを参照してください。

  • PHP の場合、ほとんどの一般的な導入構成で実行される永続的な PHP VM は、VM が再起動されるまで DNS ルックアップをキャッシュに保持します。getHostByName についての PHP ドキュメントを参照してください。