Tengo un montón de archivos dentro del cubo de Amazon s3, quiero comprimir esos archivos y descargarlos a través de la URL de S3 usando Java Spring.
S3 no es un servidor de archivos ni ofrece servicios de archivos del sistema operativo, como la manipulación de datos.
Si hay muchos archivos "ENORMES", su mejor apuesta es
Sí, puede usar AWS lambda para hacer lo mismo, pero lambda tiene un tiempo de espera de ejecución de 900 segundos (15 minutos) (por lo tanto, se recomienda asignar más RAM para aumentar el rendimiento de ejecución de lambda)
El tráfico de S3 a la instancia EC2 de la región local, etc., es GRATIS.
Si su propósito principal es solo leer esos archivos dentro de la misma región de AWS utilizando los servicios EC2/etc, entonces no necesita este paso adicional. Simplemente acceda al archivo directamente.
(Actualización): como mencionó @Robert Reiz, ahora también puede usar AWS Fargate para hacer el trabajo.
Nota :
Se recomienda acceder y compartir archivos mediante la API de AWS. Si tiene la intención de compartir el archivo públicamente, debe analizar seriamente el problema de seguridad e imponer una restricción de descarga. El tráfico de AWS a Internet nunca es barato.
Hola, recientemente tuve que hacer eso para mi aplicación: servir un paquete de archivos en formato zip a través de un enlace de URL que los usuarios pueden descargar.
En pocas palabras, primero cree un objeto usando el método BytesIO, luego use el método ZipFile para escribir en este objeto iterando todos los objetos s3, luego use el método put en este objeto zip y cree una URL predeterminada para él.
El código que usé se ve así:
Primero, llame a esta función para obtener el objeto zip, ObjectKeys son los objetos s3 que debe colocar en el archivo zip.
def zipResults(bucketName, ObjectKeys): buffer = BytesIO() with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as zip_file: for ObjectKey in ObjectKeys: objectContent = S3Helper().readFromS3(bucketName, ObjectKey) fileName = os.path.basename(ObjectKey) zip_file.writestr(fileName, objectContent) buffer.seek(0) return bufferLuego llame a esta función, la clave es la clave que le da a su objeto zip:
def uploadObject(bucketName, body, key): s3client = AwsHelper().getClient("s3") try: response = s3client.put_object( Bucket=bucketName, Body=body, Key=key ) except ClientError as e: logging.error(e) return None return responsePor supuesto, necesitaría los módulos io, zipfile y boto3.
Si necesita archivos individuales (objetos) en S3 comprimidos, entonces es posible hacerlo de forma indirecta. Puede definir un punto final de CloudFront que apunte al depósito S3 y luego dejar que CloudFront comprima el contenido al salir: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html