#!/usr/bin/env python

# S3 versioned buckets with many objects can be difficult to delete due to
# (1) S3 using delete markers instead of deleting objects and
# (2) web console and cli operations time out when the bucket has many versioned objects.
# This script delete all versioned objects from a bucket, then deletes the bucket.

import boto3


BATCH_SIZE = 1000
BUCKET_NAME = ''

s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET_NAME)

object_versions = bucket.object_versions.page_size(count=BATCH_SIZE)
delete_batch = []
batch_num = 1
for ov in object_versions:
    delete_batch.append(ov)
    if len(delete_batch) >= BATCH_SIZE:
        print(f'Deleting batch {batch_num} of {BATCH_SIZE} items..')
        bucket.delete_objects(
            Delete={
                'Objects': [
                    {
                        'Key': ver_to_delete.object_key,
                        'VersionId': ver_to_delete.id
                    } for ver_to_delete in delete_batch
                ]
                # 'Quiet': True|False
            }
        )
        delete_batch = []
        batch_num += 1

bucket.delete()