Trabajo con S3 y almacenamiento en la nube en Kotlin: AWS SDK y MinIO

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con S3 y almacenamiento en la nube en Kotlin



Los almacenes de objetos en la nube compatibles con el protocolo Amazon S3 (Simple Storage Service) se han convertido en el estándar de facto para almacenar datos no estructurados: imágenes, videos, registros, copias de seguridad y artefactos de compilación. En el ecosistema de Kotlin (JVM, Android, Kotlin Multiplatform), se utilizan dos enfoques principales para interactuar con S3: el oficial AWS SDK for Java/Kotlin y el ligero MinIO Java SDK. En este artículo, analizaremos ambas opciones, mostraremos ejemplos de código y daremos recomendaciones para elegir.



1. AWS SDK for Java (Kotlin)



El SDK oficial de Amazon admite todas las funcionalidades de S3, incluyendo carga multiproceso, gestión del ciclo de vida, versionado y cifrado. Para Kotlin, basta con agregar la dependencia en build.gradle.kts:



dependencies {    implementation("software.amazon.awssdk:s3:2.27.0")    implementation("software.amazon.awssdk:auth:2.27.0")}


Ejemplo básico de carga de un archivo en un bucket de S3:



import software.amazon.awssdk.auth.credentials.AwsBasicCredentialsimport software.amazon.awssdk.auth.credentials.StaticCredentialsProviderimport software.amazon.awssdk.regions.Regionimport software.amazon.awssdk.services.s3.S3Clientimport software.amazon.awssdk.services.s3.model.PutObjectRequestimport java.nio.file.Paths

fun main() { val credentials = AwsBasicCredentials.create("ACCESS_KEY", "SECRET_KEY") val s3 = S3Client.builder() .region(Region.EU_CENTRAL_1) .credentialsProvider(StaticCredentialsProvider.create(credentials)) .build()

val request = PutObjectRequest.builder() .bucket("my-bucket") .key("uploads/photo.jpg") .contentType("image/jpeg") .build()

s3.putObject(request, Paths.get("/local/path/photo.jpg")) println("Archivo cargado")}


Descarga de un objeto:



import software.amazon.awssdk.services.s3.model.GetObjectRequest

val getRequest = GetObjectRequest.builder() .bucket("my-bucket") .key("uploads/photo.jpg") .build()

s3.getObject(getRequest, Paths.get("/local/download/photo.jpg"))


2. MinIO Java SDK (Almacenamiento compatible con S3)



MinIO es un almacén de objetos de alto rendimiento y código abierto, totalmente compatible con la API de S3. Su SDK es adecuado para trabajar tanto con MinIO local como con AWS S3, DigitalOcean Spaces, Yandex Object Storage y otros proveedores. Agregue la dependencia:



dependencies {    implementation("io.minio:minio:8.5.10")}


Ejemplo de carga de un archivo a través del SDK de MinIO:



import io.minio.MinioClientimport io.minio.PutObjectArgsimport java.io.FileInputStream

fun main() { val minioClient = MinioClient.builder() .endpoint("https://play.min.io") .credentials("minioadmin", "minioadmin") .build()

val inputStream = FileInputStream("/local/data/report.pdf") minioClient.putObject( PutObjectArgs.builder() .bucket("documents") .`object`("reports/2024/report.pdf") .stream(inputStream, inputStream.available(), -1) .contentType("application/pdf") .build() ) println("Archivo cargado en MinIO")}


Descarga a través de MinIO:



import io.minio.GetObjectArgsimport java.io.FileOutputStream

val getArgs = GetObjectArgs.builder() .bucket("documents") .`object`("reports/2024/report.pdf") .build()

val response = minioClient.getObject(getArgs)response.use { stream -> FileOutputStream("/local/download/report.pdf").use { output -> stream.transferTo(output) }}


3. Trabajo con enlaces públicos y tiempos de expiración



Generación de un enlace temporal (presigned URL) para descargar sin a

Recommendations