マネジメントコンソールでS3バケットにアクセスすると、フォルダの作成
というボタンがあり。
S3にフォルダがあるのは当たり前のようにあると思い込んでしまいます。
フォルダを使用して Amazon S3 コンソールでオブジェクトを整理する
しかし上記ドキュメントを読むと、Amazon S3 はフラットな構造であり、ファイルシステムに見られる階層はありません。
と記載があります。
マネジメントコンソールではフォルダが見えており、階層構造のように感じてしまいますが。
S3はファイルシステムのような階層構造ではなく、フォルダがあるように見せかける仕組みをつかって、フォルダの移行、コピー、削除、フォルダの合計サイズなどが提供されています。
フォルダの実態について
フォルダを使用して Amazon S3 コンソールのオブジェクトを整理する
上記ドキュメントの重要の部分に記載があります。
以下ドキュメントより引用
Amazon S3 にフォルダを作成すると、S3 は、指定したフォルダ名に設定されたキーを持つ 0 バイトのオブジェクトを作成します。例えば、バケットに photos という名前のフォルダを作成した場合、Amazon S3 コンソールは photos/ キーを使用して 0 バイトのオブジェクトを作成します。コンソールは、フォルダの考え方をサポートするために、このオブジェクトを作成します。
Amazon S3 コンソールでは、キー名の最後 (末尾) の文字がスラッシュ (/) になっているすべてのオブジェクト (examplekeyname/ など) がフォルダとして扱われます。キー名の末尾の文字が / のオブジェクトは、Amazon S3 コンソールを使用してアップロードすることができません。ただし、Amazon S3 API で名前の末尾が / のオブジェクトは、AWS Command Line Interface (AWS CLI)、AWS SDK、または REST API を使用してアップロードできます。
名前の末尾が / のオブジェクトは、Amazon S3 コンソールではフォルダとして扱われます。Amazon S3 コンソールには、このようなオブジェクトのコンテンツやメタデータが表示されません。コンソールを使用して名前の末尾が / のオブジェクトをコピーすると、コピー先の場所に新しいフォルダが作成されますが、オブジェクトのデータとメタデータはコピーされません。
上記の記述がすべてですが、S3では /
の文字をフォルダの階層構造を表現するために利用しており、末尾が/
となるオブジェクトはフォルダとして取り扱う事がわかります。
またAmazon S3にフォルダが作成する際に、作成されるオブジェクトは0バイトでフォルダ名/
といったオブジェクトが作成されていると記載があります。
マネジメントコンソールで合計サイズを計算するにどう表示されるか
マネジメントコンソールでフォルダを作成してその配下にファイルを配置した場合
マネジメントコンソールからhelloworldという名前でフォルダを作り、その配下にhelloworld.txtを格納した場合
オブジェクトの合計数が2になっている事がわかります。
aws-cliでfoobar.txtのみをアップロードする場合
aws-cliを利用し、上記のようにfoobar/foobar1/foobar.txtといった形でアップロードしてみました。
このようにアップロードする事で、フォルダオブジェクトは作成されませんが、マネジメントコンソール上ではうまい事フォルダっぽく表示してくれる状態になります。
この状態で合計サイズを確認してみます。
フォルダオブジェクトを作成していないので、オブジェクトの合計数が1となっている事がわかります。
上記のような感じでフォルダ2つに、ファイル1つでオブジェクトの合計数が3つになりそうな気がしますが、フォルダオブジェクトは作成していないので実態はオブジェクトの合計数は1になっています。
このようにフォルダオブジェクトが存在するかしないかでオブジェクトの合計数に影響を与えてしまう点は意識しておいた方がよいかと思います。
総評
Amazon S3基本の部分となり、情報を取得する際などに意識するケースはある気はします。