Tengo 2 cubos S3. El depósito A es donde se carga un archivo zip y el depósito B contiene los datos extraídos del último archivo comprimido que se cargó en el depósito A. Tengo un Lambda que se activa con un evento de creación de objetos del depósito A, luego extrae el archivo zip como un transmite y sube al cubo B. Aquí está el código:
const aws = require('aws-sdk'); const unzipper = require('unzipper'); const s3Client = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = async (event, context) => { const sourceBucket = event.Records[0].s3.bucket.name; const zip = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const s3Params = { Bucket: sourceBucket, Key: zip }; const zip = s3Client.getObject(s3Params).createReadStream().pipe(unzipper.Parse({ forceStream: true })); const promises = []; for await (const file of zip) { const type = file.type; if (type === 'File') { const fileName = file.path; const params = { Bucket: process.env.DEST_BUCKET, Key: `${fileName}`, Body: file, }; promises.push(s3Client.upload(params).promise()); } else { file.autodrain(); } } await Promise.all(promises); };El problema es que el zip tiene unos 200 MB con más de 10.000 archivos y carpetas. La lambda, incluso establecida en 900 segundos, se está agotando. ¿Existe una manera más eficiente de escribir el código anterior para utilizar algo como flujos paralelos o reescritura del bucle for?