AWS S3 con Java: carga de archivos, creación y eliminación de depósitos de S3

En este artículo, cubriremos el SDK y la API de AWS Java para crear un depósito S3, cargar archivos en el depósito y eliminar el depósito.

Introducción

En este artículo, usaremos el SDK y la API de Java AWS para crear un depósito S3, cargar archivos en él y, finalmente, eliminarlo.

Uno de los servicios más populares disponibles en Amazon Web Services es el Simple Storage Service (S3).

S3 facilita a los desarrolladores y otros usuarios la implementación del almacenamiento de datos para uso personal o sus aplicaciones. Los datos se almacenan usando un modelo llamado Almacenamiento de objetos en la nube, que almacena los datos en sí (generalmente de un archivo), algunos metadatos que describen el objeto y una ID para identificar el objeto de forma única.

S3 proporciona una interfaz web que facilita la carga de archivos para almacenarlos y recuperarlos. Los archivos se pueden organizar en "cubos S3" separados, que son contenedores de datos.

Los archivos de datos se pueden categorizar aún más en carpetas dentro de cubos para una organización y acceso familiares basados ​​en rutas. Cada depósito se asigna a una URL que permite acceder a los archivos dentro del depósito a través de HTTP. Los usuarios tienen control total para establecer permisos a nivel de depósito o de archivo y, por lo tanto, determinar el acceso a los depósitos y su contenido.

Además de crear y trabajar con depósitos S3 a través de la interfaz web, AWS proporciona los SDK que nos brindan acceso a las operaciones del depósito.

Credenciales de AWS

Comencemos aprendiendo cómo crear un conjunto de credenciales de AWS, que son necesarias para acceder a AWS y realizar llamadas a la API a través del SDK. La forma más sencilla de hacerlo es iniciar sesión en la consola de AWS y crear un nuevo rol IAM (Administración de identidad y acceso):

  1. Inicie sesión en la Consola de AWS.

  2. Haga clic en el menú Servicios en la parte superior izquierda de la pantalla, busque IAM y haga clic en la opción desplegable que aparece.

AWS IAM Services Menu

  1. Bajo el encabezado Estado de seguridad, expanda la opción Crear usuarios individuales de IAM y haga clic en el botón Administrar usuarios.

AWS IAM Manage Users

  1. Haga clic en el botón Agregar usuario.

  2. Ingrese el nombre de usuario para su nuevo usuario de IAM y marque la casilla de Acceso programático.

AWS IAM User Details

  1. Haga clic en el botón Siguiente: Permisos y luego seleccione Adjuntar políticas existentes directamente.

  2. Escriba S3 en el cuadro de búsqueda y, en los resultados, marque la casilla de AmazonS3FullAccess.

AWS IAM S3 Permissions

  1. Haga clic en el botón Siguiente: Etiquetas, luego haga clic en el botón Siguiente: Revisar.

  2. Revise la configuración de usuario de IAM y haga clic en el botón Crear usuario.

  3. Accederá a una página de confirmación, donde puede copiar el ID de la clave de acceso y la Clave de acceso secreta, que son las credenciales que utilizará para acceder a la API de AWS a través de la SDK de Java.

De manera predeterminada, el SDK buscará las credenciales en el Archivo de perfil de credenciales predeterminado, que es un archivo que normalmente se encuentra en ~/.aws/credentials en su máquina local. Deberá crear este archivo usted mismo y agregarle las credenciales de IAM.

Para configurar esto usted mismo, cree el nuevo archivo ~/.aws/credentials y agregue los siguientes contenidos, reemplazando la clave de acceso y la clave secreta con los valores de su usuario de IAM recién creado en la consola de AWS:

1
2
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

Cree un archivo de región predeterminado para que lo use el SDK de AWS agregando un nuevo archivo llamado ~/.aws/config con el siguiente contenido (puede reemplazar la región con una más cercana a donde viven sus usuarios para un rendimiento óptimo):

1
region = US_WEST_2

El entorno local ahora debe configurarse para que AWS Java SDK se autentique correctamente.

Instalación del SDK con Maven

Si está utilizando Maven, agregue la siguiente dependencia para incluir el SDK de Java de AWS:

1
2
3
4
5
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>${version}</version>
</dependency>

O, si estás usando Gradle:

1
compile group: 'com.amazonaws', name: 'aws-java-sdk', version: '${version}'

Ahora, en lugar de solo la dependencia de S3, puede usar aws-java-sdk, que es el SDK completo. Hay muchas dependencias en todo el SDK - 219, para ser exactos, por lo que si solo usa S3, no es necesario descargarlas todas.

¡En este punto, estamos listos para automatizar la creación de depósitos, la carga de archivos en ellos y la eliminación de depósitos usando Java!

Creación de un depósito S3 con Java

El SDK de AWS Java para S3 proporciona varias clases que se pueden utilizar para crear un depósito nuevo. Estos se encuentran en la biblioteca software.amazon.awssdk. Estas clases son:

  • Región: representa una región de alojamiento de AWS para realizar las operaciones del SDK.
  • S3Client: se utiliza para instalar y configurar un cliente para conectarse a AWS S3 a través de servicios web.
  • CreateBucketRequest: representa una solicitud web para crear depósitos S3.
  • CreateBucketConfiguration: representa la configuración para la creación del depósito S3.

Echemos un vistazo a cómo podemos configurar un cubo para la creación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder().region(region).build();
String bucket = "new-bucket12345";

CreateBucketRequest createBucketRequest = CreateBucketRequest
    .builder()
    .bucket(bucket)
    .createBucketConfiguration(CreateBucketConfiguration.builder()
        .locationConstraint(region.id())
        .build())
    .build();

s3.createBucket(createBucketRequest);

Primero, hemos configurado un objeto Region. Si omitimos este paso, se usa la región predeterminada en ~/.aws/config. Establezca la región más cercana a donde estarán sus usuarios.

Luego, creamos un objeto S3Client y usamos su builder(), pasando la región, para instanciarlo.

Finalmente, para crear un depósito, necesitaremos empaquetar todo en una solicitud y activar esa solicitud usando la instancia S3Client.

Para empaquetar todo en una solicitud, llamamos al builder() de la clase CreateBucketRequest y pasamos el nombre del depósito y el ID de la región.

Finalmente, llamamos al método createBucket().

Nota: los nombres de depósito de Amazon deben ser únicos a nivel mundial. Cambie el nombre new-bucket12345 por otro.

Después de ejecutar este código, el depósito sí aparece en nuestra consola de AWS:

AWS S3 Bucket

Ahora que nuestro depósito está en funcionamiento, ¡continuemos y carguemos algunos archivos en él!

Carga de un archivo en un depósito de S3

Para cargar un objeto en un depósito existente, AWS Java SDK for S3 nos proporciona PutObjectRequest y RequestBody, que se utilizan con S3Client y Region.

  • PutObjectRequest: representa una solicitud web para cargar un objeto en un depósito de S3.
  • RequestBody: Representa el cuerpo de la solicitud web que contiene el objeto a cargar.

Echemos un vistazo a cómo podemos usar estas clases para cargar un archivo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class UploadObject {
    public static void main(String[] args) throws IOException {
        
        Region region = Region.US_WEST_2;
        S3Client s3 = S3Client.builder().region(region).build();

        String bucket = "new-bucket12345";
        String key = "key";

        // Put Object
        s3.putObject(PutObjectRequest.builder().bucket(bucket).key(key)
                .build(), RequestBody.fromByteBuffer(getRandomByteBuffer(10000)));
    }

    private static ByteBuffer getRandomByteBuffer(int size) throws IOException {
        byte[] b = new byte[size];
        new Random().nextBytes(b);
        return ByteBuffer.wrap(b);
    }
}

El método putObject() de la clase S3Client acepta un objeto PutObjectRequest. Lo hemos llenado con un búfer de bytes aleatorios. Cuando ejecutamos este código, se cargará un nuevo archivo llamado “clave” en el depósito.

Revisemos el depósito S3 en la consola de AWS:

AWS S3 Bucket

Eliminación de un depósito de S3

Además de las clases anteriores, y de la misma manera, la clase DeleteBucketRequest se utiliza para enviar una solicitud de eliminación de un depósito.

1
2
3
4
5
6
7
8
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder().region(region).build();

String bucket = "new-bucket12345";

DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder().bucket(bucket).build();

s3.deleteBucket(deleteBucketRequest);

Al igual que antes, configuramos un S3Client con la instancia de Region y pasamos el nombre del depósito. Finalmente, instanciamos un objeto DeleteBucketRequest con la información del depósito y ejecutamos el método deleteBucket() desde la clase S3Client.

Después de eliminar el depósito, se eliminará de la consola S3.

Conclusión

En este artículo, discutimos cómo instalar y configurar AWS SDK para Java, específicamente para el servicio S3. Cubrimos la configuración de las credenciales para la autenticación del SDK de AWS y agregamos las dependencias requeridas mediante Maven.

También detallamos el código Java para algunas operaciones comunes de S3, como la creación de un nuevo depósito, la carga de objetos en un depósito y la eliminación de un depósito.

Sobre el autor

Este artículo fue escrito por Jacob Stopak, un desarrollador de software y consultor apasionado por ayudar a otros a mejorar sus vidas a través del código. Jacob es el autor de la Guía básica de codificación para desarrolladores, un libro introductorio que cubre conceptos y herramientas de codificación esenciales. Contiene capítulos sobre arquitectura informática básica, Internet, línea de comandos, HTML, CSS, JavaScript, Python, Java, bases de datos/SQL, Git y más.