Subir archivos a AWS S3 con Node.js

Gran parte del software y las aplicaciones web que construimos hoy en día requieren algún tipo de alojamiento para archivos: imágenes, facturas, archivos de audio, etc. La forma tradicional de almace...

Introducción

Gran parte del software y las aplicaciones web que creamos hoy en día requieren algún tipo de alojamiento para archivos: imágenes, facturas, archivos de audio, etc. La forma tradicional de almacenar archivos era simplemente guardarlos en el disco duro del servidor. Sin embargo, guardar archivos en el disco duro del servidor tiene limitaciones, como no poder escalar, tener que asignar espacio antes de usarlo y precios mucho más altos/no flexibles. Sin mencionar que solicitar una gran cantidad de imágenes (potencialmente grandes) realmente puede ejercer presión sobre el servidor.

Para descargar los servidores, los desarrolladores comenzaron a alojar archivos con proveedores de almacenamiento como AWS S3, [Almacenamiento en la nube de Google](https://cloud.google .com/almacenamiento/), etc.

En este artículo, le mostraremos cómo escribir código Node.js para cargar archivos en S3.

¿Qué es S3?

S3, o Simple Storage Service, es un servicio de almacenamiento en la nube proporcionado por Amazon Web Services (AWS). Con S3, puede alojar cualquier cantidad de archivos y pagar solo por lo que usa.

S3 también proporciona alojamiento multirregional a los clientes por su región y, por lo tanto, puede entregar rápidamente los archivos solicitados con un retraso mínimo.

Configuración del entorno

Credenciales de AWS

Para comenzar, primero debe generar las AWS Security Key Access Credentials. Para hacerlo, inicie sesión en su Consola de administración de AWS.

Haga clic en su nombre de usuario:

Luego seleccione Teclas de acceso -> Crear nueva clave de acceso:

Después de eso, puede copiar la Identificación de la clave de acceso y la Clave de acceso secreta desde esta ventana o puede descargarla como un archivo .CSV:

Creación de un depósito S3

Ahora vamos a crear un depósito de AWS S3 con acceso adecuado. Podemos hacer esto usando la consola de administración de AWS o usando Node.js.

Para crear un depósito de S3 mediante la consola de administración, vaya al servicio de S3 seleccionándolo en el menú de servicios:

Seleccione "Crear depósito" e ingrese el nombre de su depósito y la región en la que desea alojar su depósito. Si ya sabe de qué región provendrá la mayoría de sus usuarios, es aconsejable seleccionar una región lo más cercana posible a la suya. Esto asegurará que los archivos del servidor se sirvan en un marco de tiempo más óptimo.

El nombre que seleccione para su depósito debe ser un nombre único entre todos los usuarios de AWS, así que pruebe con uno nuevo si el nombre no está disponible:

Siga el asistente y configure los permisos y otras configuraciones según sus requisitos.

Para crear el depósito usando Node.js, primero tendremos que configurar nuestro entorno de desarrollo.

Entorno de desarrollo {#entorno de desarrollo}

Entonces, ahora comencemos con nuestro ejemplo configurando un nuevo proyecto Node.js:

1
$ npm init

Para comenzar a usar cualquier servicio en la nube de AWS en Node.js, debemos instalar el AWS SDK (Kit de desarrollo del sistema).

Instálelo usando su administrador de paquetes preferido; usaremos npm:

1
$ npm i --save aws-sdk

Implementación

Creación de un depósito S3

Si ya ha creado un depósito manualmente, puede omitir esta parte. Pero si no, vamos a crear un archivo, por ejemplo, create-bucket.js en el directorio de tu proyecto.

Importe la biblioteca aws-sdk para acceder a su depósito S3:

1
const AWS = require('aws-sdk');

Ahora, definamos tres constantes para almacenar ID, SECRET y BUCKET_NAME. Estos se utilizan para identificar y acceder a nuestro cubo:

1
2
3
4
5
6
// Enter copied or downloaded access ID and secret key here
const ID = '';
const SECRET = '';

// The name of the bucket that you have created
const BUCKET_NAME = 'test-bucket';

Ahora, necesitamos inicializar la interfaz S3 pasando nuestras claves de acceso:

1
2
3
4
const s3 = new AWS.S3({
    accessKeyId: ID,
    secretAccessKey: SECRET
});

Con la interfaz S3 inicializada con éxito, podemos continuar y crear el depósito:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const params = {
    Bucket: BUCKET_NAME,
    CreateBucketConfiguration: {
        // Set your region here
        LocationConstraint: "eu-west-1"
    }
};

s3.createBucket(params, function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log('Bucket Created Successfully', data.Location);
});

En este punto, podemos ejecutar el código y probar si el depósito se crea en la nube:

1
$ node create-bucket.js

Si la ejecución del código es exitosa, debería ver el mensaje de éxito, seguido de la dirección del depósito en la salida:

1
Bucket Created Successfully http://test-bucket-2415soig.s3.amazonaws.com/

Puede visitar su panel de S3 y asegurarse de que se haya creado el depósito:

Para ver una lista completa de regiones y otros parámetros, consulte la documentación oficial.

Subiendo archivos

En este punto, implementemos la funcionalidad de carga de archivos. En un archivo nuevo, p. upload.js, importe la biblioteca aws-sdk para acceder a su depósito S3 y el módulo fs para leer archivos desde su computadora:

1
2
const fs = require('fs');
const AWS = require('aws-sdk');

Necesitamos definir tres constantes para almacenar ID, SECRET y BUCKET_NAME e inicializar el cliente S3 como lo hicimos antes.

Ahora, vamos a crear una función que acepte un parámetro fileName, que representa el archivo que queremos subir:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const uploadFile = (fileName) => {
    // Read content from the file
    const fileContent = fs.readFileSync(fileName);

    // Setting up S3 upload parameters
    const params = {
        Bucket: BUCKET_NAME,
        Key: 'cat.jpg', // File name you want to save as in S3
        Body: fileContent
    };

    // Uploading files to the bucket
    s3.upload(params, function(err, data) {
        if (err) {
            throw err;
        }
        console.log(`File uploaded successfully. ${data.Location}`);
    });
};

Antes de cargar el archivo, necesitamos leer su contenido como un búfer. Después de leerlo, podemos definir los parámetros necesarios para la carga del archivo, como Cubo, Clave y Cuerpo.

Además de estos tres parámetros, hay una larga lista de otros parámetros opcionales. Para tener una idea de las cosas que puede definir para un archivo mientras lo carga, aquí hay algunas útiles:

  • StorageClass: Define la clase en la que quieres almacenar el objeto. S3 está diseñado para proporcionar un servicio rápido de archivos. Pero en caso de que no se acceda a los archivos con frecuencia, puede usar una clase de almacenamiento diferente. Por ejemplo, si tiene archivos que apenas se tocan, puede almacenarlos en "S3 Glacier Storage", donde el precio es muy bajo en comparación con "S3 Standard Storage". Pero llevará más tiempo acceder a esos archivos en caso de que los necesite y esté cubierto por un acuerdo de nivel de servicio diferente.
  • ContentType: Establece el tipo MIME de la imagen. El tipo predeterminado será "binary/octet-stream". Agregar un tipo MIME como "image/jpeg" ayudará a los navegadores y otros clientes HTTP a identificar el tipo de archivo.
  • ContentLength: establece el tamaño del cuerpo en bytes, lo que resulta útil si el tamaño del cuerpo no se puede determinar automáticamente.
  • ContentLanguage: establezca este parámetro para definir en qué idioma está el contenido. Esto también ayudará a los clientes HTTP a identificar o traducir el contenido.

Para el parámetro Cubo, usaremos nuestro nombre de depósito, mientras que para el parámetro Clave agregaremos el nombre del archivo que queremos guardar como, y para el parámetro Cuerpo, usaremos contenido del archivo.

Una vez hecho esto, podemos cargar cualquier archivo pasando el nombre del archivo a la función:

1
uploadFile('cat.jpg');

Puede reemplazar "cat.jpg" con un nombre de archivo que exista en el mismo directorio que el código, una ruta de archivo relativa o una ruta de archivo absoluta.

En este punto, podemos ejecutar el código y probar si funciona:

1
$ node upload.js

Si todo está bien, debería ver un resultado como el que se muestra a continuación con un enlace a su archivo, que se almacena en data.Location:

1
File uploaded successfully. https://test-bucket-1242tsr.s3.ap-northeast-2.amazonaws.com/cat.jpg

Si hay algún error, también debería mostrarse en la consola.

Además, puede ir a su depósito en la Consola de administración de AWS y asegurarse de que el archivo esté cargado.

Conclusión

Para descargar nuestros servidores de aplicaciones, una opción popular de los desarrolladores es alojar archivos usando proveedores de almacenamiento como AWS S3, Google Cloud Storage, etc. Hemos creado una aplicación Node.js muy simple que maneja las cargas de archivos a S3 usando su interfaz. a través del módulo aws-sdk.

Según sus requisitos, también puede configurar el acceso público a su depósito o a los archivos mediante la consola.

Si quieres jugar con el código, como siempre, puedes encontrarlo en GitHub en esta esencia.