Michi
Michi

Reputation: 577

Delete all versions of an object S3 using java

I want to delete all versions of an object with a given key using software.amazon.awssdk.s3 v2.

So far I found out there is no such deleteAllVersions(key), you have to get all versionIds of your object and iterate and delete each version. The next hurdle is, there is no such listAllVersions(key), only a listAllVersions(prefix). So if I want to listAllVersions("a") of object "a" with prefix "a" as filter, I also get all version of "aa", "ab", "ac" and so on.

It is now possible to iterate an ignore all objects not having exactly key "a". But how to handle a truncated response?

How to delete all versions of an object with a specific key, including versions marked deleted?

Upvotes: 3

Views: 2390

Answers (1)

Michi
Michi

Reputation: 577

Use ListObjectVersionsIterable returned by listObjectVersionsPaginator:

    //Pre-filter with prefix
    ListObjectVersionsRequest listRequest = ListObjectVersionsRequest.builder().bucket(bucketName).prefix(key).build();
    ListObjectVersionsIterable responses = s3Client.listObjectVersionsPaginator(listRequest);

    for (ObjectVersion objectVersion : responses.versions())
    {
        //Filter pre-filtered result
        if (objectVersion.key().equals(key))
        {
            DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder().bucket(bucketName).key(key).versionId(versionId).build();
            DeleteObjectResponse response = s3Client.deleteObject(deleteRequest);
        }
    }

The Paginator will handle the calls internally: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#listObjectVersionsPaginator-software.amazon.awssdk.services.s3.model.ListObjectVersionsRequest-

Upvotes: 4

Related Questions