S3のフォルダ配下のオブジェクトをすべて削除したときの挙動について

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

S3をローカルディスクと同じように考えて利用していて、少しハマったので共有させていただきます。

タイトルにはわかりやすいように書いてしまっていますが、次の記事のように普通のローカルディスクにあるような"フォルダ"という概念はS3には存在しません。

Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする

このため、フォルダがあるように考えて利用すると、思うように行かない場面がありました。

あるPrefix以下のオブジェクトをすべて削除すると…?

結果を言うと、S3のあるPrefix配下のオブジェクトをすべて削除したとき、"フォルダ"も一緒に消えてしまいます。

次のようにAWS CLIからファイルを作成してみます。

$ aws s3 mv sample.txt s3://sample-bucket-name123/sampleFolder/sample.txt

AWSのWebコンソール上から見ると、

のように表示され、sampleFolderというフォルダがあり、その中にsample.txtが入っているように見えます。

普通のローカルディスクのフォルダとファイルの関係であれば、ファイルを削除してもフォルダは残るように考えるかと思います。しかし冒頭の記事のとおり、S3のファイル名は単にキーなので、ファイルを削除すると、

$ aws s3 rm s3://sample-bucket-name123/sampleFolder/sample.txt

上記の通り"フォルダ"も一緒になくなってしまいます。

対策

存在しないprefixに対して次のようにリスト操作をかけても、

$ aws s3api list-objects-v2 --bucket sample-bucket-name123 --prefix notExistsPrefix/

特にエラーにはならないので大抵の場合は大丈夫かと思いますが、何らかの理由により"フォルダ"があるように見せたい場合の対処について記載しておきます。

次のようなコマンドで、"フォルダオブジェクト"を作成することにより、

$ aws s3api put-object --bucket sample-bucket-name123 --key sampleFolder/

配下のオブジェクトを作成、削除しても"フォルダ"が残ったままにすることが出来ます。

$ aws s3 mv sample.txt s3://sample-bucket-name123/sampleFolder/sample.txt
$ aws s3 rm s3://sample-bucket-name123/sampleFolder/sample.txt
$ aws s3api list-objects-v2 --bucket sample-bucket-name123 --prefix sample-folder/
{
    "Contents": [
        {
            "Key": "sample-folder/",
            "LastModified": "2018-10-15T01:37:59.000Z",
            "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
            "Size": 0,
            "StorageClass": "STANDARD"
        }
    ]
}

おわりに

S3についてある程度理解していないと、ちょっと分かりづらい記事になってしまったかもしれません。 冒頭にある記事をよく読み、S3のキーというものがどういうものか理解したのであれば、この記事の内容も理解できるかと思います。