Saltar al contenido

¿Eliminar todas las versiones de un objeto en S3 usando python?

Sé libre de compartir nuestros post y códigos con tus amigos, ayúdanos a aumentar nuestra comunidad.

Solución:

Las otras respuestas eliminan objetos individualmente. Es más eficiente utilizar el eliminar_objetos boto3 llama y procesa por lotes su eliminación. Consulte el código a continuación para ver una función que recopila todos los objetos y los elimina en lotes de 1000:

bucket = 'bucket-name'
s3_client = boto3.client('s3')
object_response_paginator = s3_client.get_paginator('list_object_versions')

delete_marker_list = []
version_list = []

for object_response_itr in object_response_paginator.paginate(Bucket=bucket):
    if 'DeleteMarkers' in object_response_itr:
        for delete_marker in object_response_itr['DeleteMarkers']:
            delete_marker_list.append('Key': delete_marker['Key'], 'VersionId': delete_marker['VersionId'])

    if 'Versions' in object_response_itr:
        for version in object_response_itr['Versions']:
            version_list.append('Key': version['Key'], 'VersionId': version['VersionId'])

for i in range(0, len(delete_marker_list), 1000):
    response = s3_client.delete_objects(
        Bucket=bucket,
        Delete=
            'Objects': delete_marker_list[i:i+1000],
            'Quiet': True
        
    )
    print(response)

for i in range(0, len(version_list), 1000):
    response = s3_client.delete_objects(
        Bucket=bucket,
        Delete=
            'Objects': version_list[i:i+1000],
            'Quiet': True
        
    )
    print(response)

Tuve problemas para usar las otras soluciones a esta pregunta, así que aquí está la mía.

import boto3
bucket = "bucket name goes here"
filename = "filename goes here"

client = boto3.client('s3')
paginator = client.get_paginator('list_object_versions')
response_iterator = paginator.paginate(Bucket=bucket)
for response in response_iterator:
    versions = response.get('Versions', [])
    versions.extend(response.get('DeleteMarkers', []))
    for version_id in [x['VersionId'] for x in versions
                       if x['Key'] == filename and x['VersionId'] != 'null']:
        print('Deleting  version '.format(filename, version_id))
        client.delete_object(Bucket=bucket, Key=filename, VersionId=version_id)

Este código se ocupa de los casos en que

  • el control de versiones de objetos no está realmente activado
  • hay DeleteMarkers
  • no hay DeleteMarkers
  • hay más versiones de un archivo determinado de las que caben en una sola respuesta de API

La respuesta de Mahesh Mogal no elimina DeleteMarkers. La respuesta de Mangohero1 falla si al objeto le falta un DeleteMarker. La respuesta de Hari se repite 10 veces (para solucionar la falta de lógica de paginación).

La documentación es útil aquí:

  1. Cuando el control de versiones está habilitado en un depósito de S3, una simple solicitud de DeleteObject no puede eliminar de forma permanente un objeto de ese depósito. En su lugar, Amazon S3 inserta un marcador de eliminación (que en realidad es una nueva versión del objeto con su propio ID de versión).
  2. Cuando intenta OBTENER un objeto cuya versión actual es un marcador de eliminación, S3 se comporta como si el objeto se hubiera eliminado (aunque no lo haya hecho) y devuelve un error 404.
  3. Para eliminar de forma permanente un objeto de un depósito versionado, use DeleteObject, con el ID de versión correspondiente, para todas y cada una de las versiones del objeto (y eso incluye los marcadores de eliminación).

Sección de Reseñas y Valoraciones

Acuérdate de que tienes la opción de interpretar si diste con el arreglo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *