Estoy tratando de extraer varios archivos del depósito de AWS S3 y estoy dispuesto a fusionar la respuesta de todos los archivos después.
Por ejemplo, tengo los siguientes archivos:
my-bucket/mainfile1.json.gz my-bucket/mainfile2.json.gz my-bucket/mainfile3.json.gzActualmente estoy accediendo a un solo archivo como este:
const unzipFromS3 = (key, bucket) => { return new Promise(async (resolve, reject) => { AWS.config.loadFromPath(process.env["PWD"]+'/private/awss3/s3_config.json'); var s3 = new AWS.S3(); let options = { 'Bucket': "my-bucket", 'Key': "mainfile1.json.gz", }; s3.getObject(options, function(err, res) { if(err) return reject(err); resolve(zlib.unzipSync(res.Body).toString()); }); }); }; unzipFromS3().then(function(result){ console.dir(result); });Ahora bien, esto funciona perfectamente para un solo archivo, pero ¿cómo puedo lograr esto con varios archivos en caso de que quiera fusionar datos de 3 archivos separados?
Aquí hay una idea inicial de cómo leer los archivos JSON comprimidos con gzip de S3, descomprimirlos, luego combinar los objetos de JavaScript resultantes y, finalmente, comprimir y escribir los resultados combinados en S3.
const aws = require('aws-sdk'); const zlib = require('zlib'); const s3 = new aws.S3(); const BUCKET = 'mybucket'; const PREFIX = ''; const FILES = ['test1.json.gz', 'test2.json.gz', 'test3.json.gz']; (async () => { const promises = []; try { for (let ii = 0; ii < FILES.length; ii++) { const params = { Bucket: BUCKET, Key: `${PREFIX}${FILES[ii]}`, }; console.log('Get:', params.Key, 'from:', params.Bucket); promises.push(s3.getObject(params).promise()); } const results = await Promise.all(promises); const buffers = results.map(result => result.Body); const content = buffers.map(buffer => JSON.parse(zlib.unzipSync(buffer).toString())); console.log('Read OK', JSON.stringify(content)); const merged = Object.assign({}, ...content); console.log('Merged content', JSON.stringify(merged)); const params = { Bucket: BUCKET, Key: `${PREFIX}result/test.json.gz`, Body: zlib.gzipSync(JSON.stringify(merged), 'utf8'), }; console.log('Put:', params.Key, 'to:', params.Bucket); const rc = await s3.putObject(params).promise() } catch (err) { console.log(err, err.stack); throw err; } })();