Searching...
miércoles, 14 de junio de 2023

Generar un ZIP de objetos S3 con un prefijo de clave comun

En este código, el trait S3ZipManager se encarga de las responsabilidades relacionadas con la generación del archivo ZIP y la subida a S3. El objeto S3ZipGenerator extiende este trait y proporciona la implementación de los valores bucketName y s3KeyPrefix. Luego, en el método main, simplemente llamamos al método generateAndUploadZip() para generar y subir el archivo ZIP.

hemos extraído la lógica repetitiva a métodos privados. El método createS3Client() se encarga de crear el cliente S3, generateZipBytes() genera los bytes del archivo ZIP, listObjectsInS3() lista los objetos en S3, addToZip() agrega un archivo al ZIP y uploadZipToS3() sube el archivo ZIP a S3.

import java.io.{ByteArrayInputStream, ByteArrayOutputStream}

import java.util.zip.{ZipEntry, ZipOutputStream}

import software.amazon.awssdk.auth.credentials.{DefaultCredentialsProvider, StaticCredentialsProvider}

import software.amazon.awssdk.regions.Region

import software.amazon.awssdk.services.s3.{S3Client, S3Configuration}

import software.amazon.awssdk.services.s3.model.{CreateBucketRequest, PutObjectRequest}


import scala.collection.JavaConverters._

import java.time.LocalDate

import java.time.format.DateTimeFormatter


trait S3ZipManager {

  def bucketName: String

  def s3KeyPrefix: String


  def generateAndUploadZip(): Unit = {

    val zipFileName = s"your-prefix_${LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))}.zip"

    val s3Client = createS3Client()


    val zipFileBytes = generateZipBytes(s3Client)

    uploadZipToS3(s3Client, zipFileName, zipFileBytes)


    println(s"ZIP file $zipFileName created and uploaded to S3.")

  }


  private def createS3Client(): S3Client = {

    S3Client.builder()

      .region(Region.US_EAST_1) // Specify your desired region

      .credentialsProvider(DefaultCredentialsProvider.create())

      .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())

      .build()

  }


  private def generateZipBytes(s3Client: S3Client): Array[Byte] = {

    val byteArrayOutputStream = new ByteArrayOutputStream()

    val zipOutputStream = new ZipOutputStream(byteArrayOutputStream)


    listObjectsInS3(s3Client).foreach { s3Object =>

      val s3ObjectKey = s3Object.key()

      val s3ObjectContent = s3Client.getObject(builder =>

        builder.bucket(bucketName).key(s3ObjectKey)

      ).readAllBytes()


      addToZip(zipOutputStream, s3ObjectKey, s3ObjectContent)

    }


    zipOutputStream.close()

    byteArrayOutputStream.toByteArray

  }


  private def listObjectsInS3(s3Client: S3Client): Seq[software.amazon.awssdk.services.s3.model.S3Object] = {

    val listObjectsResponse = s3Client.listObjects(builder =>

      builder.bucket(bucketName).prefix(s3KeyPrefix)

    )

    listObjectsResponse.contents().asScala.toSeq

  }


  private def addToZip(zipOutputStream: ZipOutputStream, entryName: String, content: Array[Byte]): Unit = {

    zipOutputStream.putNextEntry(new ZipEntry(entryName))

    zipOutputStream.write(content)

    zipOutputStream.closeEntry()

  }


  private def uploadZipToS3(s3Client: S3Client, zipFileName: String, zipFileBytes: Array[Byte]): Unit = {

    val zipFileInputStream = new ByteArrayInputStream(zipFileBytes)

    val putObjectRequest = PutObjectRequest.builder()

      .bucket(bucketName)

      .key(zipFileName)

      .contentType("application/zip")

      .build()


    s3Client.putObject(putObjectRequest, zipFileInputStream)

  }

}


object S3ZipGenerator extends S3ZipManager {

  override val bucketName: String = "your-bucket-name"

  override val s3KeyPrefix: String = "your/s3/key/prefix/"


  def main(args: Array[String]): Unit = {

    generateAndUploadZip()

  }

}


0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!