node.js - 从文件夹内部将文件保存到 lambda 中的 /tmp
问题描述
我有一个使用 lambda 将文件下载和上传到 s3 的任务,场景就像
- 将文件从 s3 bucket1(请求文件夹)下载到 lambda
- 从 lambda 将相同的文件上传到 s3 bucket2(请求文件夹)
downloadFiles
和uploadFiles
fn 都在utils/s3.js
lambda 的根目录(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,
但是我为什么要这样做并且它不起作用,我哪里错了?
解决方案
正如一位评论者已经说过的,如果您不对文件本身做任何事情,最好只使用 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);
}
推荐阅读
- excel - VBA查找文本并用计算填充行
- ruby - 从 JRuby 中的给定文件夹中获取子文件夹列表
- xamarin - Xamarin Android:java.exe 退出,代码 2 - 启用了 MultiDex
- excel - .Add2 生成运行时错误“438”:对象在 Excel VBA 中不支持此属性或方法
- javascript - 节点用户模型获取类型错误:无法设置未定义的属性“getUserId”
- php - PHP in_array( 0, ['aaa', 'bbb'] ) 返回 TRUE?
- dart - Rxdart 包与 google_sign_in 或 flutter_facebook_login 一起使用时会导致 Flutter 应用程序在启动时崩溃
- angular - 使用http时的角度6未定义函数
- xamarin.android - 命名空间无法正确解析 Android.Support.V4.App.ListFragment
- android - 侦听器仅将列表中的最后一个图像添加到 RecyclerView