从文件夹内部将文件保存到 lambda 中的 /tmp
Saving file to /tmp in lambda from inside of a folder
我有一个使用lambda下载和上传文件到s3的任务,场景是这样的
- 将文件从 s3 bucket1(请求文件夹)下载到 lambda
- 从 lambda 将相同的文件上传到 s3 bucket2(请求文件夹)
downloadFiles
和 uploadFiles
fn 都在 utils/s3.js
里面 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'""
现在我已经阅读了 Whosebug 上的大部分答案,我知道我应该将文件保存到 /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);
}
我有一个使用lambda下载和上传文件到s3的任务,场景是这样的
- 将文件从 s3 bucket1(请求文件夹)下载到 lambda
- 从 lambda 将相同的文件上传到 s3 bucket2(请求文件夹)
downloadFiles
和 uploadFiles
fn 都在 utils/s3.js
里面 utils/s3.js
在 lambda
这是我的 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'""
现在我已经阅读了 Whosebug 上的大部分答案,我知道我应该将文件保存到 /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);
}