Amazon S3には、バケットにファイルをアップロードするだけでウェブサイトとして公開できる静的ウェブサイトホスティングという機能があります。Route 53を活用することで、自分で用意したドメインへのアクセスをS3バケットに転送することも可能です。これらは公式チュートリアルに沿ってやればできるのですが、その中に気になる一文があります。
バケット名はドメイン名と厳密に一致している必要があります
例えばhttp://example.com
でウェブサイトを運用したい場合、バケット名もexample.com
にする必要があります。ただバケット名はリージョン内で一意でなければいけないので、すでに他の人がそのバケット名を使っていることだってあり得ます。なぜこんな制約があるのでしょうか?1
DNSの仕組み
そもそもhttp://example.com
のようなアドレスからウェブサイトを見つけるには、まずドメインexample.com
をIPアドレスに変換する必要があります。ドメイン名からIPアドレスへ変換することを名前解決といい、名前解決をしてくれるシステムがDNS (Domain Name System)です。DNSにはレコードと呼ばれる情報が格納されていて、それらを参照することで名前解決を行います。AWSでDNSを運用するためのサービスがRoute 53です。
AレコードとCNAMEレコード
Aレコードは、ドメインとIPアドレスの対応づけを定義するためのレコードです。
レコード名 | タイプ | 値 |
---|---|---|
example.com | A | x.x.x.x |
上記の例で言えば、example.com
のデータはIPアドレスx.x.x.x
のサーバにあると定義するわけです。
ついでにCNAMEレコードというものもあって、これはあるドメインの別名を定義するものです。
レコード名 | タイプ | 値 |
---|---|---|
sub.example.com | CNAME | example.com |
example.com | A | x.x.x.x |
この例だと、sub.example.com
はexample.com
の別名であり、sub.example.com
のIPアドレスを知るためにはexample.com
のAレコードを参照すれば良いことになります。
エイリアスレコード
Aレコードには対応するIPアドレスを具体的に記入する必要があるのですが、AWSのように大規模でIPアドレスも固定されていない環境での運用は不便です。これを補うためにAレコードを拡張したのがエイリアスレコードで、Route 53固有の機能です。
Route 53でAレコードを作成する際にエイリアスをオンにすると、対応しているAWSのサービス一覧が表示されので、IPアドレスの代わりに目的のリソースを選ぶことができます。エイリアスレコードの実態はあくまでもAレコードなので、名前解決の問い合わせに対しては、Amazonが自動的にリソースに対応するIPアドレスを応答してくれます。
独自ドメインとS3の静的ウェブサイトホスティング
自分で用意したドメインでウェブサイトを運用したい場合、DNSへのAレコードやエイリアスレコードの登録が必要なのはわかりました。しかしS3で静的ウェブサイトホスティングをしたい場合、どのIPアドレスをレコードに記入すれば良いのでしょうか?
仮に世界中の個々のS3バケットにIPアドレスが割り振られているとしたら話は簡単で、レコードにそのアドレスを記入すれば良いでしょう。しかしIPv4で扱えるアドレスは限られているので(というか大体の地域で枯渇してる)、Amazonが静的ウェブサイトホスティング機能を使用する全てのバケットのためにIPアドレスを用意するのは現実的に無理でしょう。
従って窓口となるIPアドレスを用意し、HTTPリクエストの情報をもとにバケット名を推測して、目的のバケットへと転送せざるを得ません。そこでAmazonはHTTPリクエストに書かれているドメイン名を使うことにしたのだと思います(HTTP/1.1でいうならばHostリクエストヘッダの値2)。
結論
ネットでも断片的にしか情報が見つからなかったので、自分なりに考察を加えて出した結論は以下です。
- 独自ドメインとバケットのIPアドレスの紐づけが必要(名前解決)
- IPv4を使用する限り、個々のバケットにIPアドレスを割り振るには数が足りない
- 窓口となるIPアドレスを用意して、HTTPリクエストに書かれているドメイン名をもとに目的のバケットを探すことにした
IPv6に完全に移行できたら、こんな制約は不要になるんじゃないかなと思います。