Сохранение файла в / tmp в лямбде изнутри папки

У меня есть задача скачать и закачать файлы на s3 с помощью лямбды, Scenerio как

  • Загрузите файл из s3 bucket1 (папка запроса) в lambda
  • Загрузите тот же файл в s3 bucket2 (папку запроса) из лямбды

И downloadFiles, и uploadFiles fn находятся внутри utils/s3.js внутри корневого каталога (var / task /) в лямбда-выражении.

Вот мои utils/s3.js файлы загрузки fn

exports.downloadFiles = async () => {
  try{
    const location = path.join( __dirname , `../tmp/text.txt`);
    console.log(location); // prints /var/task/tmp/text.txt
    console.log(__dirname); // prints /var/task/utils
    const params = {
      Bucket: 'bucket1',
      Key: `request/text.txt`
    };

    const { Body } = await s3.getObject(params).promise();
    fs.writeFileSync(location, Body);
    return;
  }catch(e){
    throw new Error(e.message);
  }
};

Теперь есть два случая,

  • Если я создаю папку в корневом каталоге tmp, выдает эту ошибку

    EROFS: файловая система только для чтения, откройте ‘/var/task/tmp/text.txt’

  • Если я этого не сделаю, тогда

    ENOENT: нет такого файла или каталога, откройте ‘/var/task/tmp/text.txt’

Теперь я прочитал большинство ответов на stackoverflow, я знаю, что должен сохранять файлы в /tmp/filename,, но почему я делаю то же самое, а это не работает, где я так ошибаюсь?

Что делать, если у меня уже есть sns-триггер для этой лямбда-функции на основе sns, который мне нужно загрузить?   —  person Vinita    schedule 08.07.2021

Я думаю, что у вас здесь плохой подход. Зачем использовать временную папку? Вы можете напрямую копировать файлы с помощью лямбда без необходимости загружать их во временную папку (также временная папка имеет ограничение в 500 МБ). Пример на Python (есть также некоторая автоматизация на основе триггера события, но вы можете видеть логику): geeksforgeeks.org/   —  person Vinita    schedule 08.07.2021

См. также:  Symfony: ошибка установки пакета администрирования sonata
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Vinita

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

    Соответствующую документацию можно найти здесь: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property

    Пример:

    var params = {
      CopySource: "/<source-bucket>/<source-key>", 
      Bucket: "<destination-bucket>",
      Key: "<destination-key>"
    };
    
    s3.copyObject(params, function(err, data) {
       if (err) console.log(err, err.stack); 
       else     console.log(data);
    });
    

    Или, если вы хотите использовать обещание, это тоже должно сработать:

    var params = {
      CopySource: "/<source-bucket>/<source-key>", 
      Bucket: "<destination-bucket>",
      Key: "<destination-key>"
    };
    
    try {
        const result = await s3.copyObject(params).promise();
    } catch (error) {
        console.log(error);
    }
    

    как я могу получить URL-адрес файла после его копирования в новую корзину? person Vinita; 08.07.2021

    @Vinita Насколько я знаю, для этого нет API. Но вы можете легко создать URL самостоятельно. Формат: https://<bucket>.s3.<region>.amazonaws.com/<object-key>. person Vinita; 08.07.2021

    и мне придется сначала создать папки целевого ведра вручную, или это можно создать динамически, как в putObject ()? person Vinita; 08.07.2021

    Хорошо, это тоже создает, @Jens Большое спасибо за то, что помогли мне :) person Vinita; 08.07.2021

    Еще одно сомнение в том, какие изменения потребуются, если у меня будут исходные и целевые сегменты в двух разных учетных записях aws. person Vinita; 08.07.2021

    @Vinita Отметьте этот вопрос SO: stackoverflow.com/questions/62811782/ person Vinita; 08.07.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: