es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar objetos de S3 comparando la fecha de última modificación con la fecha actual.

Quiero eliminar objetos de S3 que fueron cargados ayer. Quiero ejecutar una función de AWS Lambda todos los días que eliminará los objetos cargados el día anterior.

Encontré un código de muestra en otro hilo y traté de usarlo, pero obtengo un error que dice:

{ “errorMessage”: “no se pueden comparar datetimes sin zona horaria con datetime con zona horaria”,
“errorType”: “TypeError”}

Estoy en Sydney y S3 muestra “lastmodified” según la zona horaria local, pero la función Lambda devuelve la hora en la zona horaria UTC. El código que encontré contiene una fecha estática, pero me gustaría tener una comparación dinámica para la marca de tiempo diaria.

import os

import boto3

from datetime import datetime

bucket = os.environ["NOMBRE_DEL_BUCKET_S3"]

s3 = boto3.client('s3', region_name='ap-southeast-2')

response = s3.list_objects_v2(Bucket=bucket)

keys_a_eliminar = [{'Key': objeto['Key']} for objeto in response['Contents'] if objeto['LastModified'] < datetime(2022, 1, 7)]

s3.delete_objects(Bucket=bucket, Delete={'Objects': keys_a_eliminar})

Por favor, ayúdame a corregir esto o si alguien conoce una mejor manera de lograr esto. Soy nuevo en el mundo de DevOps y no tengo mucha experiencia en programación.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para eliminar objetos de S3 que fueron subidos ayer, puedes modificar el código calculando dinámicamente la marca de tiempo del día anterior en la misma zona horaria que la marca de tiempo LastModified del bucket de S3. Aquí tienes un fragmento de código actualizado:

    import os
    from datetime import datetime, timedelta
    import pytz
    import boto3
    
    # Establecer la zona horaria de la marca de tiempo LastModified del bucket de S3
    bucket_timezone = pytz.timezone('Australia/Sydney')
    
    # Obtener la marca de tiempo actual en la zona horaria del bucket
    now = datetime.now(tz=bucket_timezone)
    
    # Calcular la marca de tiempo del día anterior en la zona horaria del bucket
    yesterday = now - timedelta(days=1)
    
    # Convertir la zona horaria del bucket a UTC para comparar con la zona horaria de Lambda
    yesterday_utc = yesterday.astimezone(pytz.utc)
    
    bucket_name = os.environ["S3_BUCKET_NAME"]
    
    s3 = boto3.client('s3')
    
    response = s3.list_objects_v2(Bucket=bucket_name)
    
    keys_to_delete = [{ 'Key': obj['Key'] } for obj in response['Contents'] if obj['LastModified'] < yesterday_utc]
    
    s3.delete_objects(Bucket=bucket_name, Delete={ 'Objects': keys_to_delete })
    

    Este código obtiene la fecha y hora actual en la zona horaria de la marca de tiempo LastModified del bucket de S3, y calcula la marca de tiempo del día anterior en esa misma zona horaria. Luego, convierte la marca de tiempo del día anterior a UTC para compararla con la zona horaria de Lambda. Finalmente, recupera la lista de objetos de S3 y elimina los objetos que fueron subidos antes de la marca de tiempo calculada.

    Asegúrate de establecer la variable bucket_timezone con la zona horaria correcta de tu bucket de S3. Puedes verificar la zona horaria observando la marca de tiempo LastModified en la consola de S3. Este código asume que la función de Lambda se está ejecutando en la misma zona horaria que el bucket de S3. Si ese no es el caso, deberás ajustar el código para convertir la hora actual a la zona horaria del bucket de S3 antes de calcular la marca de tiempo del día anterior.

Comments are closed.