У меня есть задача скачать и закачать файлы на 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
Как уже сказал один из комментаторов, если вы ничего не делаете с самим файлом, было бы намного лучше просто использовать S3 API для копирования объекта, а не загружать и повторно загружать его.
Соответствующую документацию можно найти здесь: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property
Пример:
Или, если вы хотите использовать обещание, это тоже должно сработать:
как я могу получить 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