Мне нужно загрузить большое количество файлов (около 40 МБ каждый) из s3 (около 4 ГБ) из лямбда-функции.
Я использовал несколько библиотек, таких как архиватор, s3-zipper и т. Д. У всех есть некоторые ограничения диска или памяти. Мое окончательное решение состояло в том, чтобы создать потоки чтения для каждого файла в s3, добавить их в архиватор и направить этот поток обратно в поток загрузки в корзину s3. Он работает нормально, примерно до 4 файлов, а затем файлы начинают повреждаться. Я удалил весь причудливый код и попробовал с жесткими путями пути файла и т. Д. Все еще не работает. Первые 4 или иногда 5 файлов находятся в конечном zip-файле, но все остальные файлы - это пустые файлы размером 33 КБ (одинакового размера)
var fs = require('fs');
var stream =require('stream');
var archiver = require('archiver');
const aws = require('aws-sdk');
var async = require('async');
const path = require('path');
const bucket = 'testbucket-download'
const ustream = require('s3-upload-stream');
exports.handler = (event, context, callback) => {
const s3 = new aws.S3();
const uploadStream = ustream(s3);
var upload = uploadStream.upload({
"Bucket": "testbucket-download",
"Key": "download.zip"
});
var archive = archiver('zip');
archive.pipe(upload);
let rs = s3.getObject({Bucket:bucket,Key:'abc1234/img.jpg'}).createReadStream();
archive.append(rs, { name: 'img.jpg' });
let rs2 = s3.getObject({Bucket:bucket,Key:'abc1234/img2.jpg'}).createReadStream();
archive.append(rs2, { name: 'img2.jpg' });
let rs3 = s3.getObject({Bucket:bucket,Key:'abc1234/img3.jpg'}).createReadStream();
archive.append(rs3, { name: 'img3.jpg' });
let rs4 = s3.getObject({Bucket:bucket,Key:'abc1234/img4.jpg'}).createReadStream();
archive.append(rs4, { name: 'img4.jpg' });
let rs5 = s3.getObject({Bucket:bucket,Key:'abc1234/img5.jpg'}).createReadStream();
archive.append(rs5, { name: 'img5.jpg' });
let rs6 = s3.getObject({Bucket:bucket,Key:'abc1234/img6.jpg'}).createReadStream();
archive.append(rs6, { name: 'img6.jpg' });
let rs7 = s3.getObject({Bucket:bucket,Key:'abc1234/img7.jpg'}).createReadStream();
archive.append(rs7, { name: 'img7.jpg' });
let rs8 = s3.getObject({Bucket:bucket,Key:'abc1234/img8.jpg'}).createReadStream();
archive.append(rs8, { name: 'img8.jpg' });
let rs9 = s3.getObject({Bucket:bucket,Key:'abc1234/img9.jpg'}).createReadStream();
archive.append(rs9, { name: 'img9.jpg' });
archive.finalize();
upload.on('uploaded', function (details) {
console.log(details);
return callback(null,'yessss')
});
Может кто-нибудь помочь с любой идеей, что происходит. Есть ли какие-то ограничения, которые я здесь пропускаю?