Amazon Simple Storage Service
開発者ガイド (API バージョン 2006-03-01)

バケットの仮想ホスティング

一般的に仮想ホスティングとは、単一のウェブサーバーから複数のウェブサイトにサービスを提供することです。サイトを区別する方法の 1 つとして、単なる URI のパス名部分ではなく、リクエストの明確なホスト名を使用します。通常の Amazon S3 REST リクエストは、リクエスト URI パスのスラッシュで区切られた先頭コンポーネントを使用してバケットを指定します。これに対し Amazon S3 仮想ホスティングでは、HTTP Host ヘッダーを使用することで、REST API 呼び出しでバケットを指定することができます。実際には、Amazon S3 は Host を、ほとんどのバケットは http://bucketname.s3.amazonaws.com で自動的にアクセス可能である意味であると解釈します (限定されたタイプのリクエストの場合)。さらに、登録されたドメイン名を使用してバケットの名前を指定し、その名前を Amazon S3 の DNS エイリアスにすることによって、Amazon S3 リソースの URL を完全にカスタマイズすることができます (例: http://my.bucketname.com/)。

カスタマイズされた URL の利便性に加えて、仮想ホスティングの 2 つ目の利点として、バケットの仮想サーバーの「ルートディレクトリ」に公開する機能があります。多くの既存のアプリケーションがこの標準ロケーションでファイルを検索するため、この機能は重要です。たとえば、favicon.icorobots.txtcrossdomain.xml はすべてルートで見つかることが見込まれています。

Amazon S3 では、仮想ホステッドスタイルとパススタイルのアクセスがすべてのリージョンでサポートされます。ただし、パススタイル構文の場合は、バケットへのアクセスを試行するときにリージョン固有のエンドポイントを使用する必要があります。たとえば、欧州 (アイルランド) リージョンにある mybucket という名前のバケットがあり、パススタイル構文を使用する場合、オブジェクト名が puppy.jpg なら、正しい URI は http://s3-eu-west-1.amazonaws.com/mybucket/puppy.jpg になります。

米国東部 (バージニア北部) リージョン以外のバケットにアクセスする際に、パススタイル構文で以下のいずれかを使用すると、HTTP レスポンスコード 307 Temporary Redirect エラー、およびリソースの正しい URI を伝えるメッセージが表示されます。

  • http://s3.amazonaws.com

  • バケットがあるリージョンとは異なるリージョンのエンドポイント。たとえば、米国西部 (北カリフォルニア) リージョンで作成されたバケットに対して http://s3-eu-west-1.amazonaws.com を使用する場合です。

重要

地域固有のエンドポイント (たとえば、s3-eu-west-1.amazonaws.com) の代わりに米国東部 (バージニア北部) のエンドポイント (s3.amazonaws.com) を使用した場合、Amazon S3 は仮想ホスティング形式のリクエストをデフォルトで米国東部 (バージニア北部) リージョンにルーティングします。2019 年 1 月 30 日以前に開始されたリージョンにバケットを作成すると、Amazon S3 は DNS を更新してリクエストを正しいロケーションにルーティングします。この処理には時間がかかる場合があります。その間、デフォルトのルールが適用されて、仮想ホスティング–形式のリクエストは米国東部 (バージニア北部) リージョンに送信され、Amazon S3 は HTTP 307 リダイレクトによりこのリクエストを正しいリージョンにリダイレクトします。

2019 年 1 月 30 日以降に開始されたリージョンの S3 バケットの場合、DNS はリクエストをバケットが存在する AWS リージョンに直接ルーティングしません。代わりに HTTP 400 Bad Request エラーが返されます。

詳細については、「リクエストのリダイレクトと REST API」を参照してください。

SSL と共に仮想ホスティング形式のバケットを使用した場合、SSL ワイルドカード証明書は、ピリオドを含まないバケットのみと一致します。この問題を回避するには、HTTP を使用するか、または独自の証明書検証ロジックを記述します。

HTTP ホストヘッダーバケット仕様

GET リクエストが SSL エンドポイントを使用しないかぎり、HTTP Host ヘッダーを使用してリクエストに対してバケットを指定できます。REST リクエストの Host ヘッダーは、次のように解釈されます。

  • Host ヘッダーが省略されるか、またはその値が「s3.amazonaws.com」である場合、リクエストのバケットはリクエスト URI のスラッシュで区切られた先頭コンポーネント、リクエストのキーはリクエスト URI の残りの部分になります。このセクションの最初および 2 つ目の例に示すように、これが通常の方式です。ホストヘッダーは、HTTP 1.0 リクエストでのみ省略可能です。

  • 上記のいずれの条件も該当せず、Host ヘッダーの値が「.s3.amazonaws.com」で終わる場合、バケット名は Host ヘッダーの値のうち、先頭から「.s3.amazonaws.com」までの値になります。リクエストのキーはリクエスト URI になります。この解釈により、このセクションの 3 番目と 4 番目の例で示されているように、s3.amazonaws.com のサブドメインとしてバケットが公開されます。

  • それ以外の場合、リクエストのバケットは Host ヘッダーの小文字の値、リクエストのキーはリクエスト URI になります。この解釈は、バケット名と同じ DNS 名を登録していて、その名前を Amazon S3 の CNAME エイリアスとして設定している場合に有用です。このドキュメントではドメイン名の登録および DNS の設定の手順については扱いませんが、このセクションの最後の例にその結果を示します。

このセクションでは、URL およびリクエストの例を示します。

例 パス形式の方法

この例では、バケット名として johnsmith.net を、キー名として homepage.html を使用します。

URL は次のとおりです。

http://s3.amazonaws.com/johnsmith.net/homepage.html

リクエストは次のとおりです。

GET /johnsmith.net/homepage.html HTTP/1.1 Host: s3.amazonaws.com

HTTP 1.0 でのリクエストと host ヘッダーの省略は次のとおりです。

GET /johnsmith.net/homepage.html HTTP/1.0

DNS 互換名については、「制約事項」を参照してください。キーの詳細については、「キー」を参照してください。

例 仮想ホスティング形式のメソッド

この例では、バケット名として johnsmith.net を、キー名として homepage.html を使用します。

URL は次のとおりです。

http://johnsmith.net.s3.amazonaws.com/homepage.html

リクエストは次のとおりです。

GET /homepage.html HTTP/1.1 Host: johnsmith.net.s3.amazonaws.com

仮想ホスティング形式のメソッドでは、バケット名は DNS 準拠である必要があります。

例 米国東部 (バージニア北部) 以外のリージョンにおけるバケットの仮想ホスティング形式のメソッド

この例では、欧州 (アイルランド) リージョンのバケットの名前として johnsmith.eu を、キー名として homepage.html を使用します。

URL は次のとおりです。

http://johnsmith.eu.s3-eu-west-1.amazonaws.com/homepage.html

リクエストは次のとおりです。

GET /homepage.html HTTP/1.1 Host: johnsmith.eu.s3-eu-west-1.amazonaws.com

バケットがどのリージョンに存在する場合でも、リージョン固有のエンドポイントではなく、米国東部 (バージニア北部) のエンドポイントを使用することができます。

http://johnsmith.eu.s3.amazonaws.com/homepage.html

リクエストは次のとおりです。

GET /homepage.html HTTP/1.1 Host: johnsmith.eu.s3.amazonaws.com

例 CNAME 方式

この例では、バケット名として www.johnsmith.net を、キー名として homepage.html を使用します。この方式を使用するには、DNS 名を bucketname.s3.amazonaws.com の CNAME エイリアスとして設定する必要があります。

URL は次のとおりです。

http://www.johnsmith.net/homepage.html

例は次のとおりです。

GET /homepage.html HTTP/1.1 Host: www.johnsmith.net

CNAME による Amazon S3 URL のカスタマイズ

要件によっては、「s3.amazonaws.com」をウェブサイトまたはサービスに表示したくない場合もあります。たとえば、ウェブサイトの画像を Amazon S3 でホストしている場合、http://johnsmith-images.s3.amazonaws.com/ でなく http://images.johnsmith.net/ のほうがよい場合があります。

バケット名は CNAME と同じである必要があります。したがって、http://images.johnsmith.net/filenamehttp://images.johnsmith.net.s3.amazonaws.com/filename にマッピングするために CNAME が作成された場合、images.johnsmith.netimages.johnsmith.net.s3.amazonaws.com と同じになります。

DNS 互換名を持つすべてのバケットは、 http://[BucketName].s3.amazonaws.com/[Filename] のように参照できます (例: http://images.johnsmith.net.s3.amazonaws.com/mydog.jpg)。CNAME を使用して images.johnsmith.net を Amazon S3 ホスト名にマップすることができます。その場合、前述の URL は http://images.johnsmith.net/mydog.jpg になります。

CNAME DNS レコードは、ドメイン名を適切な仮想ホスティング形式のホスト名にエイリアス設定する必要があります。たとえば、バケット名およびドメイン名が images.johnsmith.net である場合、CNAME レコードは images.johnsmith.net.s3.amazonaws.com.

images.johnsmith.net CNAME images.johnsmith.net.s3.amazonaws.com.

エイリアス先を s3.amazonaws.com に設定することも有効ですが、余分な HTTP リダイレクトが発生する場合があります。

Amazon S3 はホスト名を使用してバケット名を決定します。たとえば、www.example.comwww.example.com.s3.amazonaws.com の CNAME として設定したとします。http://www.example.com にアクセスすると、Amazon S3 は次のようなリクエストを受け取ります。

GET / HTTP/1.1 Host: www.example.com Date: date Authorization: signatureValue

Amazon S3 は元のホスト名 www.example.com だけを認識し、リクエストを解決するために使用される CNAME マッピングを認識しません。そのため CNAME とバケット名は同じである必要があります。

すべての Amazon S3 エンドポイントは、CNAME で使用できます。たとえば、s3-ap-southeast-1.amazonaws.com を CNAME で使用できます。エンドポイントの詳細については、「エンドポイントのリクエスト」を参照してください。

CNAME を使用してホスト名を Amazon S3 バケットに関連付けるには

  1. 管理するドメインに属するホスト名を選択します。この例では、images ドメインの johnsmith.net サブドメインを使用します。

  2. ホスト名と一致するバケットを作成します。この例では、ホスト名およびバケット名は images.johnsmith.net です。

    注記

    バケット名はホスト名と完全に一致する必要があります。

  3. ホスト名を Amazon S3 バケットのエイリアスとして定義する CNAME レコードを作成します。次に例を示します。

    images.johnsmith.net CNAME images.johnsmith.net.s3.amazonaws.com

    重要

    リクエストルーティングの理由により、CNAME レコードは、前述の例と完全に一致するように定義する必要があります。そうしない場合、正しく動作するように見えても、最終的には予期しない結果を招くことがあります。

    注記

    DNS 設定の手順は、お使いの DNS サーバーまたは DNS プロバイダーによって異なります。個別の情報については、お使いのサーバーのマニュアルをご覧になるか、プロバイダーにお問い合わせください。

制約事項

HTTP Host ヘッダーを使用してリクエストのバケットを指定する処理は、非 SSL リクエストで、REST API の使用時にサポートされます。別のエンドポイントを使用して SOAP でバケットを指定することはできません。

注記

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

下位互換性

以前のバージョンの Amazon S3 は、HTTP Host ヘッダーを不正に無視していました。文書化されていないこの動作に依存するアプリケーションは、Host ヘッダーを正しく設定するように更新する必要があります。Amazon S3 は Host (存在する場合) からバケット名を判断するため、この問題の最も起こりうる症状として、予期せぬ NoSuchBucket エラー結果コードを受け取ることがあります。