HTTP サーバーとしての S3 にディレクトリのリスト機能はない

Published: 2023/11/11


疑問

S3 は、そこにアップロードされたオブジェクトを HTTP で公開することができる。 また、マネジメントコンソール上でもフォルダを作る、という UI があるため、静的なコンテンツ配信のための Web サーバーとして利用できる。

コンテンツ配信の Web サーバーとしてこれを扱う場合、いわゆる Apache などが用意してくれている index.html 的な機能がほしくなる。 つまり、あるフォルダの中に配置したファイルの一覧を、自動的に取得できたりすると嬉しいので、それについて調べた備忘録。

結論: そんなものはない。

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 サーバー + ディレクトリリスト機能、みたいなものが実現できそうではある。 だがしかし、そこまでやるんだったら最初から普通にサーバー立ててやればよいんじゃないか、みたいな気分になってくる。


Tags: aws-s3