お仕事でAWSを触ることがあります。
IaCにはAWS SAMを使用することが多いのですが、S3のバケット名を大文字にしていたせいでデプロイが失敗して沼りました(2回目)。 2度と同じ過ちを繰り返さないためにも、なぜAWS S3のバケット名に大文字が許可されていないのか調べてみました。
語尾誤謬などあればコンタクトからご指摘いただけますと幸いです。
まず前提として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にそのまま含まれるということです。
なんとなくご存じだと思いますが、世の中のドメインは全て小文字になっています(google.comとか、amazon.co.jpとか)。
これはなぜかというと、RFC4343でDNSが小文字と大文字を区別しないように決められているからです。 RFCに則って、DNSが全部大文字小文字区別せずに管理しており便宜上全て小文字として表示しているということですね。
実際curl https://SATAKE0916.GITHUB.IO/
とかでアクセスしてみても、普通に名前解決してくれます。
もしS3のバケット名に大文字が使えた場合、アクセスするURLにも大文字が入るべきということになります。
例えば上の例でバケット名をUPPER-BUCKET
とした場合、URLは次のようになります。
https://UPPER-BUCKET.s3.us-west-2.amazonaws.com/puppy.png
しかしDNSは大文字と小文字を区別せずに名前解決をしてしまうので、AWSは上のようなアクセスがあった際にupper-bucket
というバケットを探してしまい、「そんなバケットはないよ」となってしまいます。
ここの混乱を防ぐためにS3バケット名はDNS準拠というルールがあるようです。