HTTP サーバーとしての S3 にディレクトリのリスト機能はない
Published: 2023/11/11
疑問
S3 は、そこにアップロードされたオブジェクトを HTTP で公開することができる。 また、マネジメントコンソール上でもフォルダを作る、という UI があるため、静的なコンテンツ配信のための Web サーバーとして利用できる。
コンテンツ配信の Web サーバーとしてこれを扱う場合、いわゆる Apache などが用意してくれている index.html 的な機能がほしくなる。 つまり、あるフォルダの中に配置したファイルの一覧を、自動的に取得できたりすると嬉しいので、それについて調べた備忘録。
結論: そんなものはない。
Directory Listing in S3 Static Website
I have set up an S3 bucket to host static files. When using the website endpoint (http://.s3-website-us-east-1.amazonaws.com/): it forces me to set an index file. When the file isn't found, it th...
stackoverflow.com

S3 にアップロードする時に index.html 相当のものを自動配置したり、 AWS サービスとしての S3 API を叩くことによってリストすることはできるが、 HTTP サーバーとしての S3 は単純に、パスに対してそこにあるオブジェクトを HTTP で返す、以上の機能を持たないため、普通の静的 Web サーバーの代替として利用しようとすると、ここで躓くことになる。
マネジメントコンソール上でのフォルダ作成とは、 (プレフィックス/)フォルダ名/
という名のキーに対して、サイズ 0 のファイルを作成しているにすぎず、マネジメントコンソール上で見えるフォルダっぽいものは、現在のプレフィックス下にあるキーたちを取得して /
以降がグループ化されて表示されているだけである。
これはつまりマネジメントコンソール上では、 S3 画面という Web アプリがフォルダ機能を実装している、という構成になっている。 これができるのはマネジメントコンソールではログインしているユーザーの IAM の認証情報が利用可能なため、これを利用して、 S3 の List 系の AWS API を実行しているからである。
翻って、ただの配信 Web サーバーとして S3 を利用する際には、そのような機構は当然存在しないので、賢いことをやりたかったら何かしら他のサービスと組み合わせるなどをしなければならなくなる。
API Gateway と Lambda を組み合わせ、通常のパスなら S3 から配信し、 /
で終わっていればその直下をリストする、まで作っていけば、当初やりたかった S3 as Web サーバー + ディレクトリリスト機能、みたいなものが実現できそうではある。
だがしかし、そこまでやるんだったら最初から普通にサーバー立ててやればよいんじゃないか、みたいな気分になってくる。