потоковые файлы из s3 из лямбда-функции отказывают более 4 файлов по 40 Мб каждый.Отлично работает на 4 файла - PullRequest
0 голосов
/ 10 июля 2019

Мне нужно загрузить большое количество файлов (около 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')
  });

Может кто-нибудь помочь с любой идеей, что происходит. Есть ли какие-то ограничения, которые я здесь пропускаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...