Spring Cloud: AWS S3

S

Introducción

Servicios web de Amazon (AWS) ofrece una amplia gama de servicios informáticos fiables y bajo demanda. Para ello, oculta la gestión de la infraestructura y sus complejidades, lo que simplifica el proceso de aprovisionamiento y ejecución de la infraestructura en la nube.

AWS permite a las empresas y desarrolladores de TI centrarse en crear mejores soluciones para sus productos con servicios web escalables y bajo demanda que facilitan el aumento o la disminución de cualquier recurso a medida que la aplicación evoluciona con el tiempo.

Uno de estos productos es Simple Storage Service, o S3, que le permite almacenar archivos a escala de forma económica.

Cubo S3

De Amazon Servicio de almacenamiento simple permite a los usuarios administrar sus datos estáticos de manera confiable y eficiente al almacenarlos en los servidores de Amazon. Se puede acceder a los datos almacenados en cualquier momento desde cualquier lugar a través de Internet.

Se puede acceder a los datos almacenados en un bucket de S3 a través de Amazon Management Console, que es una interfaz de IU, así como Interfaz de línea de comandos de AWS y API REST S3 para desarrolladores.

Spring Cloud AWS

Los servicios de AWS se pueden integrar en aplicaciones Java utilizando Spring, que es un marco web Java bien conocido y más utilizado. Spring Cloud para servicios web de Amazon permite a los desarrolladores acceder a los servicios de AWS con una huella de código más pequeña y una integración simple.

Cliente Spring Amazon S3

Se puede acceder al Bucket S3 en el que se almacenan nuestros datos a través del cliente Amazon S3 de Spring, que ofrece operaciones generales para administrar datos en el servidor. En esta sección, mostraremos cómo incluir esta biblioteca cliente en su proyecto y luego veremos algunas de las operaciones comunes de S3 disponibles a través del cliente.

Dependencias de Maven

El primer paso para integrar AWS en un proyecto de Spring es, por supuesto, importar las dependencias necesarias. En este caso, usaremos speing-cloud-starter-aws, que contiene el spring-cloud-aws-context y spring-cloud-aws-autoconfigure dependencias:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-aws</artifactId>
</dependency>

Configuración de Spring Cloud AWS

Como estamos usando Spring Boot, naturalmente, la mayor parte de la configuración la realiza el propio marco. Sin embargo, las configuraciones relacionadas con AWS deben especificarse en el application.yaml archivo:

cloud:
  aws:
    region.static: "[S3 Bucket region]"
    credentials:
      accessKey: "xxxxxxx"
      secretKey: "xxxxxxx"

Tenga en cuenta que los nombres y estructuras de las propiedades están estrictamente formateados y Spring Boot los utilizará para configurar una conexión válida con los servicios de AWS.

El objeto de “supervisión” para la gestión de solicitudes al bucket de S3, utilizando el cliente S3 de Amazon, es una instancia del AmazonS3 clase:

@Autowired
private AmazonS3 amazonS3Client;

Lo conectaremos automáticamente como un bean Spring estándar y las propiedades de nuestro .yaml Se utilizará un archivo para atarlo y prepararlo para el trabajo.

Carga de archivos en S3

Se puede cargar cualquier tipo de archivo en un S3 Bucket, aunque uno de los casos de uso más comunes es el almacenamiento de imágenes. Mantener los archivos / imágenes almacenados en la nube hace que sea más fácil acceder a ellos y mantenerlos seguros en un servicio estable y rápido que puede escalar los recursos necesarios para entregar sus archivos.

Carga directa de archivos / archivos de varias partes

Una vez que el cliente S3 de Amazon es funcional, puede cargar un nuevo archivo simplemente llamando al putObject() método:

amazonS3Client.putObject(new PutObjectRequest("bucketName", "fileKey", file));

Dónde bucketName es el nombre del depósito de S3 en el que desea cargar el archivo. fileKey es un valor de cadena que identificará de forma única el archivo que se está cargando y file es un válido File objeto.

Si tiene un archivo de varias partes que ingresa a su aplicación o microservicio a través de un punto final REST expuesto, también se puede cargar. Esto requiere poco código adicional y simplemente convertimos el MultipartFile a un File:

File file = new File("FileName");
try {
    FileOutputStream fileOutputStream = new FileOutputStream(file)
    fileOutputStream.write(multipartFile.getBytes());
} catch (IOException e) {
    /* Handle Exception */
}

Lo que hemos hecho es simplemente convertir un multiparte en un Java normal File objeto usando un FileOutputStream. Una vez convertido, se puede cargar en el bucket de S3 utilizando el mismo putObject() método de antes.

Carga de archivos como metadatos

Al manejar las solicitudes y los datos recibidos a través de los puntos finales de la API, mantener una copia de los datos en nuestro propio servidor antes de cargarlos en nuestro bucket de S3 es rentable y solo aumenta el tamaño de nuestra aplicación innecesariamente, ya que el recurso principal para el almacenamiento de archivos será el Cuchara S3.

Para evitar la necesidad de conservar una copia, podemos utilizar la PutObjectRequest desde la API de Amazon para cargar el archivo en el depósito enviándolo a través de un InputStream y proporcionar detalles del archivo en forma de metadatos:

ObjectMetadata objectMetaData = new ObjectMetadata();
objectMetaData.setContentType(multipartFile.getContentType());
objectMetaData.setContentLength(multipartFile.getSize());

try {
    PutObjectRequest putObjectRequest = new PutObjectRequest("bucketName", "fileName", multipartFile.getInputStream(), objectMetaData);
    amazonS3Client.putObject(putObjectRequest);
} catch (IOException e) {
    /* Handle Exception */
}

El tamaño y el tipo de contenido del archivo se especifican mediante el ObjectMetaData objeto. El flujo de entrada del archivo se agrega al PutObjectRequest junto con el nombre del depósito de S3 al que estamos cargando, así como el nombre del archivo para asociarlo.

Una vez el PutObjectRequest se crea el objeto, se puede enviar al Bucket S3 utilizando el putObject() método, como antes.

Carga de archivos con vista pública

A veces, es posible que deseemos que los archivos cargados estén disponibles públicamente. Un lector no debería necesitar autorización para ver las imágenes en una publicación de blog, por ejemplo. Hasta ahora, hemos cargado archivos que requieren nuestra autorización para verlos.

El S3 de AWS nos brinda opciones para establecer el nivel de acceso en cada archivo cargado, durante su carga.

Para cambiar el nivel de acceso y dar acceso público, modifiquemos ligeramente la solicitud de carga de datos:

new PutObjectRequest("bucketName", "fileName", multipartFile.getInputStream(), objectMetaData)
    .withCannedAcl(CannedAccessControlList.PublicRead)

Añadiendo el CannedAccessControlList.PublicRead propiedad a la PutObjectRequest brinda acceso público de solo lectura para el archivo que se está cargando, lo que permite que cualquier persona con la URL correcta acceda / vea el archivo.

Una vez el PutObjectRequest se crea el objeto, luego se puede cargar en un bucket de S3 utilizando el mismo putObject() método como antes.

Descarga de archivos desde S3

Una vez cargados, puede descargar fácilmente archivos de su depósito usando el getObject() método a través del AmazonS3 instancia de la clase.

El objeto devuelto se empaqueta en un S3Object instancia, que luego se puede transmitir a una Object:

S3Object s3Object = amazonS3Client.getObject("bucketName", "fileName");
S3ObjectInputStream inputStream = s3Object.getObjectContent();
byte[] bytes = StreamUtils.copyToByteArray(inputStream);
File file = new File("File_Name");
try {
    FileOutputStream fileOutputStream = new FileOutputStream(file)
    fileOutputStream.write(bytes);
} catch (IOException e) {
    /* Handle Exception */
}

Si la solicitud para descargar el archivo se realiza a través de un punto final REST, podemos devolver los datos del archivo a la entidad que llama sin crear una File usando Spring’s ResponseEntity:

S3Object s3Object = amazonS3Client.getObject("bucketName", "fileName");
S3ObjectInputStream inputStream = s3Object.getObjectContent();
byte[] bytes = StreamUtils.copyToByteArray(inputStream);
String contentType = s3Object.getObjectMetadata().getContentType();
return ResponseEntity.ok().contentType(contentType).body(bytes);

De esta manera, no tenemos que crear un archivo en nuestro servidor al descargar desde el depósito de S3, el archivo simplemente se devuelve a la persona que llama en la respuesta de la API.

Eliminar archivo de S3 Bucket

Eliminar archivos de un depósito de S3 es la tarea más sencilla y todo lo que necesita saber es la ruta absoluta al archivo.

Llamando al deleteObject() El método con el nombre del depósito y el nombre completo del archivo elimina el archivo del servidor, si existe:

amazonS3Client.deleteObject("bucketName", "fileName");

Conclusión

El S3 de Amazon proporciona una forma conveniente de almacenar datos de archivos en la nube y ofrece un medio confiable para acceder a los datos cuando sea necesario.

Con Spring Cloud AWS, los desarrolladores pueden acceder fácilmente a los servicios S3 de Amazon desde su aplicación para realizar las operaciones necesarias.

Para las aplicaciones Spring Boot, toda la administración de la conexión al servidor de Amazon es manejada por la propia Spring, lo que simplifica las cosas que usar el aws-java-sdk con aplicaciones simples de Java.

Como se desprende de los fragmentos de código anteriores, acceder al depósito de S3 con Spring Cloud AWS es bastante simple y la huella del código también es muy pequeña.

El código fuente del proyecto está disponible en GitHub.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad