'How can I delete via python all the s3 "delete marker" placeholder filtered by "LastModified " (for ex. just from yesterday)?

I modified some scripts to delete all the "delete marker" placeholders from some bucket in s3 but I never found/developed something where I can delete the "delete marker" filtered by datetime. My scope is to create a script to run after a "delete_object_job" failure, so I can run a new script where set the datatime of the failure and delete all the "delete-marker" just from that datetime.

Actually from this code I can delete all the "data marker" from some buckets but without a datetime filter:

    #!/usr/bin/env python
    import json
    from datetime import datetime
    
    from boto3 import Session
    
    BUCKET_NAME = "germano"
    prefix = ''
    
    session = Session(region_name='eu-south-1', profile_name='default')
    bucket = session.client('s3')
    MAX_KEYS = 10000
    
    
    def get_bucket_versions(version_id, key):
        return bucket.list_object_versions(Bucket=BUCKET_NAME,
                                           MaxKeys=MAX_KEYS,
                                           Prefix=prefix,
                                           VersionIdMarker=version_id,
                                           KeyMarker=key)
    
    
    class DateTimeEncoder(json.JSONEncoder):
        def default(self, o):
            if isinstance(o, datetime):
                return o.isoformat()
            return json.JSONEncoder.default(self, o)
    
    #ottengo gli attributes della classe creata DateTimeEncoder
    #DateTimeEncoder = DateTimeEncoder()
    #attributes_of_DateTimeEncoder = dir(DateTimeEncoder)
    
    #print(attributes_of_DateTimeEncoder)
    
    def objects_to_restore(versions):
        return [
            {
                'VersionId': marker['VersionId'],
                'Key': marker['Key']
            } for marker in versions.get('DeleteMarkers') if marker['IsLatest']
        ]
    
    
    def restore_s3_objects(version_markers, count):
        markers_to_delete = objects_to_restore(version_markers)
        print(f"Will restore {len(markers_to_delete)} items during request number: {count}")
        if not markers_to_delete:
            return 0
        bucket.delete_objects(Bucket=BUCKET_NAME, Delete={'Objects': markers_to_delete})
        return len(markers_to_delete)
    
    
    obj_list = bucket.list_object_versions(Bucket=BUCKET_NAME,
                                           MaxKeys=MAX_KEYS,
                                           Prefix=prefix)
    _next_version_id = obj_list.get('NextVersionIdMarker')
    _next_key_marker = obj_list.get('NextKeyMarker')
    
    counter = 1
    total_restored = restore_s3_objects(obj_list, counter)
    
    while _next_version_id and _next_key_marker:
        counter += 1
        another_list_of_versions = get_bucket_versions(_next_version_id, _next_key_marker)
        _next_version_id = another_list_of_versions.get('NextVersionIdMarker')
        _next_key_marker = another_list_of_versions.get('NextKeyMarker')
        total_restored += restore_s3_objects(another_list_of_versions, counter)
    
        print(f"Total Restored: {total_restored}")


Solution 1:[1]

i solved just modifing a bit the function "objects_to_restore":

def objects_to_restore(versions, last_modified_timestamp="2022-04-28 09:19:56.986445+00:00"): print (versions.get('DeleteMarkers')) #print (versions.get('Versions'))

return [
    {
        'VersionId': marker['VersionId'],
        'Key': marker['Key'],
    } for marker in versions.get('DeleteMarkers') 
        if marker['IsLatest']
        if str(marker["LastModified"]) >= str(last_modified_timestamp)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 germano