Загрузите файл с Amazon S3 в lambda и извлеките его [дубликат]

Одна вещь, которую я удивляю, еще не упоминалась, заключается в том, что реализация Runnable делает ваш класс более гибким.

Если вы расширяете поток, то действие, которое вы делаете, всегда будет быть в потоке. Однако, если вы реализуете Runnable, это не обязательно. Вы можете запустить его в потоке или передать его какой-либо службе-исполнителю или просто передать его как задачу в однопоточном приложении (возможно, для запуска позднее, но в пределах одного потока). Опции гораздо более открыты, если вы просто используете Runnable, чем если бы вы привязали себя к Thread.

1
задан Breeds 16 August 2016 в 10:40
поделиться

2 ответа

Вы можете получить изображение с помощью aws s3 api, а затем записать его в папку tmp с помощью fs.

var params = {   Bucket: "BUCKET_NAME",   Key: "OBJECT_KEY" };  

s3.getObject(params, function(err, data){   if (err) {
    console.error(err.code, "-", err.message);
    return callback(err);   }

  fs.writeFile('/tmp/filename', data.Body, function(err){
    if(err)
      console.log(err.code, "-", err.message);

    return callback(err);   
  }); 
});

Из любопытства, зачем вам нужно писать файл, чтобы прикрепить его? Кажется, что излишне писать файл на диск, чтобы потом читать его с диска

5
ответ дан Jonathan Seed 19 August 2018 в 07:25
поделиться
  • 1
    Я использую SendGrid, поэтому кажется, что файл должен существовать на локальном диске для его присоединения. Вы говорите, что это необязательно требуется? – Breeds 16 August 2016 в 21:52
  • 2
    Я вообще не знаком с SendGrid, поэтому я не уверен, но я думал, что вы загрузите его в память, подумал, что это может быть проблемой в зависимости от размера файла. – Jonathan Seed 23 August 2016 в 14:09
  • 3
    @JonathanSeed У меня действительно есть эта проблема, что я читаю текстовый файл 150-200 Мб с помощью getObject, и это позволяет моей Лямбда-функции достичь максимального предела памяти. Есть ли обходной путь или почему ограничение памяти настолько низкое? – V. Samma 28 September 2016 в 13:28
  • 4
    @ V.Samma Вы можете настроить память для лямбда-функции в разделе «Дополнительные настройки» на консоли. Я считаю, что значение по умолчанию - 128 МБ. – Jonathan Seed 28 September 2016 в 20:42
  • 5
    @JonathanSeed Возможно, я не был достаточно ясен. Достигнув максимального предела памяти, я имел в виду, что я уже установил максимальную память для своей лямбда-функции, которая составляет 1536 МБ, и этот предел достигается, когда моя лямбда-функция пытается читать в 2 файлах (один несколько килобайт и один 150- 200 Мбайт), а затем объединить их как строковые значения и записать результат на S3. – V. Samma 29 September 2016 в 13:27

Если вы пишете это прямо в файловой системе, вы также можете делать это с потоками . Это может быть немного быстрее / удобнее для памяти, особенно в среде с ограничением памяти, например, Lambda.

var fs = require('fs');

var params = {
    Bucket: "mybucket",
    Key: "image.png"
};

var tempFileName = path.join('/tmp', 'downloadedimage.png');
var tempFile = fs.createWriteStream(tempFileName);

s3.getObject(params).createReadStream().pipe(tempFile);
0
ответ дан Seafish 19 August 2018 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: