Obtener la información de un archivo almacenado en un Bucket del S3 de AWS en NodeJs (Solucionado)

Higarigaoka - Odaiba, Sin comentarios
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:

0 comentarios :

Publicar un comentario