Spring Cloud: AWS S3

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *