3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Amazon S3静的ウェブサイト】なぜバケット名をドメイン名にしないといけないのか?

Last updated at Posted at 2022-07-31

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.comexample.comの別名であり、sub.example.comのIPアドレスを知るためにはexample.comのAレコードを参照すれば良いことになります。

エイリアスレコード

Aレコードには対応するIPアドレスを具体的に記入する必要があるのですが、AWSのように大規模でIPアドレスも固定されていない環境での運用は不便です。これを補うためにAレコードを拡張したのがエイリアスレコードで、Route 53固有の機能です。

image.png

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に完全に移行できたら、こんな制約は不要になるんじゃないかなと思います。

  1. あくまでもドメインへのアクセスを直接バケットに転送したい場合です。CloudFrontなどのサービスを間に挟む場合は、ドメイン名とバケット名を一致させる必要はないです。

  2. HTTP/2では:authorityヘッダが相当するらしいです。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?