Node subir ficheros un S3 Bucket de AWS

Node

En esta publicación, quiero compartir cómo cargar una imagen en AWS S3, la maravillosa solución de alojamiento de archivos en la nube proporcionada por Amazon Web Services.

Primero, instala la biblioteca aws-sdk

npm install aws-sdk

Importarlo en su código en la parte superior del archivo que va a agregar para cargar este archivo en la funcionalidad S3:

import AWS from 'aws-sdk'

A continuación, use el SDK para crear una instancia del objeto S3. Lo asigno a una variable:

const s3 = new AWS.S3({
  accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
})

Tenga en cuenta que aquí uso dos variables de entorno: AWS_S3_ACCESS_KEY_ID y AWS_S3_SECRET_ACCESS_KEY.

Ahora viene algo de “trabajo administrativo”. Debe crear un perfil de IAM en AWS (las credenciales) con acceso programático con los permisos para AWSCloudFormationFullAccess y AmazonS3FullAccess un bucket de S3 al que tiene acceso este usuario.

No cubriré este aspecto aquí, ya que puede encontrar toneladas de artículos y documentación al respecto. Solo hablaré sobre el código JavaScript que necesita.

Ahora, necesita un blob de imagen para cargar.

Puedes usar una URL como esta:

const imageURL = 'https://url-to-image.jpg'
const res = await fetch(imageURL)
const blob = await res.buffer()

o puede obtener una imagen enviada desde un campo de imagen de formulario cargado en un formulario de varias partes:

const imagePath = req.files[0].path
const blob = fs.readFileSync(imagePath)

Finalmente, haga una llamada s3.upload() y llame a su .promise() método para que pueda usar await para esperar hasta que termine para obtener el objeto de archivo cargado:

const uploadedImage = await s3.upload({
  Bucket: process.env.AWS_S3_BUCKET_NAME,
  Key: req.files[0].originalFilename,
  Body: blob,
}).promise()

AWS_S3_BUCKET_NAME es el nombre del bucket S3, otra variable de entorno

Finalmente, puede obtener la URL de la imagen cargada en S3 haciendo referencia a la propiedad Location.

uploadedImage.Location

Debe asegurarse de configurar el bucket S3 como público para poder acceder a la URL de esa imagen.