Amazon S3 バケット内のオブジェクトを削除する際に、バケット直下のオブジェクトのみ削除する方法
--exclude や --include オプションを駆使することで、対象を絞り込みましょう。
2024.08.13
困っていること
S3 バケット内のオブジェクトについて、バケット直下のオブジェクトのみを削除したいです。
フォルダ構造が下記のようになっています。
$ aws s3 ls s3://test-bucket-blog --recursive
2024-08-01 03:22:54 0 test-aaaa.zip
2024-08-01 03:22:54 0 test-bbbb.zip
2024-08-01 03:22:10 0 test-cccc/
2024-08-01 03:23:42 0 test-cccc/data.zip
2024-08-01 03:23:24 0 test-cccc/test-dddd.zip
test で始まるオブジェクトを削除するため、下記のコマンドを実行しましたが、フォルダも削除対象になってしまいます。
$ aws s3 rm s3://test-bucket-blog --exclude "*" --include "test*" --recursive --dryrun
(dryrun) delete: s3://test-bucket-blog/test-aaaa.zip
(dryrun) delete: s3://test-bucket-blog/test-bbbb.zip
(dryrun) delete: s3://test-bucket-blog/test-cccc/
(dryrun) delete: s3://test-bucket-blog/test-cccc/data.zip
(dryrun) delete: s3://test-bucket-blog/test-cccc/test-dddd.zip
どのように回避したらいいでしょうか?
どう解決すればいいの?
Amazon S3 はあくまでキーバリューストアであり、フォルダの概念はありませんが、グループ化の方法としてフォルダの概念をサポートしています。
そのため、--include "test*"
というオプションを付与すると、test*
で始まるオブジェクト、すなわち、フォルダに見える test*
で始まるオブジェクトも対象となります。
--exclude "*/*"
をさらに指定することで、共通プレフィックスとして使われる"/"の文字列が含まれるオブジェクトを対象から外すことができます。
下記のコマンドを実施してください。
$ aws s3 rm s3://test-20240528 --exclude "*" --include "test*" --exclude "*/*" --recursive --dryrun
(dryrun) delete: s3://test-bucket-blog/test-aaaa.zip
(dryrun) delete: s3://test-bucket-blog/test-bbbb.zip
参考資料
フォルダを使用して Amazon S3 コンソールのオブジェクトを整理する - Amazon Simple Storage Service