質問: S3のバケットを削除する必要があり、下記の処理をコマンドで実行したいです。 1. S3の管理画面からversionをhideからshowに変えて全てのバージョンを表示( を参考) 2. 全てのファイルを選択して削除 3. 空になったバケットを削除 awsコマンドで下記を実行してみたのですが、まだファイルが残っていて、全てのバージョンを削除して欲しいとエラーが返ってきます。 ``` $ aws rm s3://(バケット名) --recursive $ aws rb s3://(バケット名) --force remove_bucket failed: s3://(バケット名)/ An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket. ``` 管理画面を見てもlsコマンドを打っても空ですが、管理画面のversionを表示に切り替えると見えるのでこのファイルの事だと思います。 (削除ファイルが大きいせいか、現在も削除中で終わりが見えていません。) rmコマンドには、バージョンを指定するオプションはありません。 他の方法があるのでしょうか?
回答: バージョンを有効にしたS3バケットを削除する際は、ライフサイクル設定により全バージョンファイルが消えるよう設定する必要があります。 S3コンソールのbucketのプロパティからライフサイクルの設定でprefixを空欄(バケット全体でもたぶんOK)、日数1でオブジェクト生成後1日たっているファイルがすべて削除されます。 ※以前のバージョンは上書き実行日/有効期限終了日から 1 日後 このライフサイクル設定はコマンドラインからも設定可能です。 ``` aws s3api put-bucket-lifecycle --bucket ${backet_name} --lifecycle-configuration file://lifecycle.json ``` lifecycle.jsonは以下のようになります。 ``` { "Rules": [ { "Expiration": { "Days": 1 }, "NoncurrentVersionExpiration": { "NoncurrentDays": 1 }, "ID": "Delete all", "Prefix": "", "Status": "Enabled" } ] } ``` 上記設定で全ファイルが消えれば普通にバケットを削除できます。 今のところ1日後設定が最速のようですが、Python等の言語からAPIを呼び出して削除する方法もあるようです。 コード例が以下の質問の回答にあります。(英語ですがコード例は問題ないかと)