S3のバケット名に大文字が使えないワケ

結論:DNSが大文字と小文字を区別しないから

2023年08月20日

お仕事でAWSを触ることがあります。

IaCにはAWS SAMを使用することが多いのですが、S3のバケット名を大文字にしていたせいでデプロイが失敗して沼りました(2回目)。 2度と同じ過ちを繰り返さないためにも、なぜAWS S3のバケット名に大文字が許可されていないのか調べてみました。

語尾誤謬などあればコンタクトからご指摘いただけますと幸いです。

ポイント1. S3のバケット名はURLに含まれる

まず前提としてS3はパブリックに公開されていれば次のような仮装ホスト形式のURLでアクセスすることができます(引用元)。

https://bucket-name.s3.region-code.amazonaws.com/key-name

例えばバケット名がlower-bucket、リージョンがus-west-2(オレゴン)、オブジェクト名がpuppy.pngのS3オブジェクトにアクセスするURLは次のようになります。

https://lower-bucket.s3.us-west-2.amazonaws.com/puppy.png

大事なことは、S3のバケット名はURLにそのまま含まれるということです。

ポイント2. DNSは大文字と小文字を区別しない

なんとなくご存じだと思いますが、世の中のドメインは全て小文字になっています(google.comとか、amazon.co.jpとか)。

これはなぜかというと、RFC4343でDNSが小文字と大文字を区別しないように決められているからです。 RFCに則って、DNSが全部大文字小文字区別せずに管理しており便宜上全て小文字として表示しているということですね。

実際curl https://SATAKE0916.GITHUB.IO/とかでアクセスしてみても、普通に名前解決してくれます。

S3のバケット名に大文字が使えないワケ

もしS3のバケット名に大文字が使えた場合、アクセスするURLにも大文字が入るべきということになります。

例えば上の例でバケット名をUPPER-BUCKETとした場合、URLは次のようになります。

https://UPPER-BUCKET.s3.us-west-2.amazonaws.com/puppy.png

しかしDNSは大文字と小文字を区別せずに名前解決をしてしまうので、AWSは上のようなアクセスがあった際にupper-bucketというバケットを探してしまい、「そんなバケットはないよ」となってしまいます。

ここの混乱を防ぐためにS3バケット名はDNS準拠というルールがあるようです。

まとめ

  • AWS S3は仮装ホスト形式でS3オブジェクトへのアクセスをサポートしている。そのURLにオブジェクト名が含まれる。
  • DNSは大文字と小文字を区別しないため、バケット名に大文字が含まれていたらそのバケットに正しくアクセスできない。
  • 無用な混乱を防ぐためにバケット名はDNS準拠というルールがある。

参考