Hola,
Si requieren obtener en NodeJs un archivo subido a un Bucket del S3 de AWS (Amazon), utilicen lo siguiente:
Primero, deben instalar la librería del aws-sdk mediante un terminal de NodeJs, con el siguiente comando:
npm install aws-sdk
Despues de esto, declaren la variable a utilizar para la configuración del SDK:
const AWS = require('aws-sdk');
Luego deben crear las variables de configuración para acceder al S3, sin el accessKeyId y el secretAccessKey jamás se va a conectar al S3.
const configS3AWS = {
region: "us-east-1",
credentials: {
accessKeyId: "aaXIPL44KGHY6JZPDMNW",
secretAccessKey: "WEDR0LKJmEp/KDGH00WD8kQ0vBlk2bbb5MNBV2Ra"
}
}
A continuación, se actualiza la configuración del SDK:
AWS.config.update(configS3AWS);
Luego, se instancia el objeto S3, la especificando de la región aquí es redundante:
var s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'us-east-1'});
Posteriormente, se coloca el nombre del bucket en el cual se alojan los archivos y el nombre del archivo:
const bucketParams = {
Bucket: "mi-bucket-ejemplo",
Key: "miarchivoejemplo.txt"
};
Finalmente, mediante la función getObject() del SDK se lee correctamente el archivo del Bucket del S3:
try {
// lee correctamente el archivo del Bucket S3
s3.getObject(bucketParams, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
}else{
console.log("Data del archivo: ", data); // successful response, obtiene los bytes en el Body
console.log("Informacion dentro del archivo del S3 es: ", data.Body.toString()); // successful response, obtiene la informacion dentro del archivo
}
});
} catch (error) {
console.log("El error es: ", error);
}
Eso es todo, tener en cuenta que esto se debe realizar preferiblemente dentro de una clase o función de NodeJs.
- Forma #2 - Otra forma de realizarlo es:
try {
// lee correctamente el archivo del Bucket S3 y espera su respuesta asíncronica
const data = await s3.getObject(bucketParams).promise();
console.log("Se trae correctamente en la function el archivo: ", data); // successful response, obtiene los bytes en el Body
console.log("Informacion dentro del archivo del S3 es: "); // successful response, obtiene la informacion dentro del archivo
console.log(data.Body.toString('utf-8'));
return data.Body.toString('utf-8');
} catch (error) {
console.log("El error es: ", error.message);
}
Este código anterior dentro de una función asíncrona, similar a:
async function getS3Object(parametro) {
// Aqui adentro va todo el codigo anterior para obtener la información dentro de un objecto de un Bucket del S3
}
Finalmente, se invoca así:
console.log("Se va a obtener el archivo en el Bucket del S3, correspondiente para el servicio especifico.");
let datosArchivo = ``;
await getS3Object(parametro).then((token)=>{
console.log("Se obtuvo correctamente los datos del archivo en el S3:");
console.log(token);
datosArchivo = token;
});
console.log("El valor del datosArchivo desde el S3 es:");
console.log(datosArchivo);
Se debe tener en cuenta que esto debe de ir dentro de una clase o una invocación asíncronica.
Y listo, eso es todo, las dos formas funcionan correctamente, aunque la segunda permite utilizar el valor obtenido en cualquier parte de la clase.
Basado en: