この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
S3をローカルディスクと同じように考えて利用していて、少しハマったので共有させていただきます。
タイトルにはわかりやすいように書いてしまっていますが、次の記事のように普通のローカルディスクにあるような"フォルダ"という概念は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のキーというものがどういうものか理解したのであれば、この記事の内容も理解できるかと思います。