1. ホーム
  2. amazon-web-services

[解決済み] AWS S3のバージョン管理されたバケットをCLIで削除する方法を教えてください。

2023-01-26 04:37:47

質問

私は s3cmd :

$ s3cmd -r -f -v del s3://my-versioned-bucket/

そして、AWS CLI。

$ aws s3 rm s3://my-versioned-bucket/ --recursive

しかし、これらのコマンドは両方とも単に DELETE マーカーを S3 に追加するだけです。バケットを削除するコマンドも(AWS CLIから)うまくいきません。

$ aws s3 rb s3://my-versioned-bucket/ --force
Cleaning up. Please wait...
Completed 1 part(s) with ... file(s) remaining
remove_bucket failed: s3://my-versioned-bucket/ A client error (BucketNotEmpty) occurred when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

OK...どうやって?の中に情報はありません。 のドキュメントには情報がありません。 には情報がありません。S3Cmdは'全機能を備えた'S3コマンドラインツールだと言っていますが、そのために バージョンへの言及はありません を参照しない。ウェブ インターフェイスを使用せずにこれを行う方法はありますか?これは、時間がかかり、ラップトップをオンにしておく必要があります。

どのように解決するのですか?

一つの方法は、バージョンを繰り返し、それらを削除することです。CLI では少しトリッキーですが、Java に言及されているように、そちらの方が簡単でしょう。

AmazonS3Client s3 = new AmazonS3Client();
String bucketName = "deleteversions-"+UUID.randomUUID();

//Creates Bucket
s3.createBucket(bucketName);

//Enable Versioning
BucketVersioningConfiguration configuration = new BucketVersioningConfiguration(ENABLED);
s3.setBucketVersioningConfiguration(new SetBucketVersioningConfigurationRequest(bucketName, configuration ));

//Puts versions
s3.putObject(bucketName, "some-key",new ByteArrayInputStream("some-bytes".getBytes()), null);
s3.putObject(bucketName, "some-key",new ByteArrayInputStream("other-bytes".getBytes()), null);

//Removes all versions
for ( S3VersionSummary version : S3Versions.inBucket(s3, bucketName) ) {
    String key = version.getKey();
    String versionId = version.getVersionId();          
    s3.deleteVersion(bucketName, key, versionId);
}

//Removes the bucket
s3.deleteBucket(bucketName);
System.out.println("Done!");

また、必要であれば、効率化のために呼び出しを一括削除することもできます。