【问题标题】:Saving file to /tmp in lambda from inside of a folder从文件夹内部将文件保存到 lambda 中的 /tmp
【发布时间】:2021-09-18 18:52:49
【问题描述】:

我有一个使用 lambda 下载和上传文件到 s3 的任务,场景是这样的

  • 从 s3 bucket1(请求文件夹)下载文件到 lambda
  • 从 lambda 将相同的文件上传到 s3 bucket2(请求文件夹)

downloadFiles 和 uploadFiles fn 都在 lambda 的根目录 (var/task/) 内的 utils/s3.js 内

这是我的utils/s3.jsdownloadFiles 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,,但是我为什么这样做却不起作用,我哪里错了?

【问题讨论】:

  • 我认为您在这里的做法很糟糕。为什么要使用临时文件夹?您可以直接使用 lambda 复制文件,而无需将它们下载到临时文件夹(临时文件夹也有 500mb 限制) Python 中的示例(还有一些基于事件触发的自动化,但您可以看到逻辑):geeksforgeeks.org/…
  • 如果我已经有了这个 lambda 函数的 sns 触发器,我必须根据 sns 上传文件怎么办?

标签: node.js amazon-web-services aws-lambda aws-sdk aws-sdk-nodejs


【解决方案1】:

正如一位评论者已经说过的,如果您不对文件本身做任何事情,最好只使用 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);
});

或者,如果您想使用 Promise,这也应该可以:

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);
}

【讨论】:

  • 复制到新bucket后如何获取文件url?
  • @Vinita 据我所知,没有用于此的 API。但是您可以轻松地自己创建 URL。格式为:https://&lt;bucket&gt;.s3.&lt;region&gt;.amazonaws.com/&lt;object-key&gt;.
  • 我必须先手动创建目标存储桶文件夹,否则可以像在 putObject() 中那样动态创建?
  • 好的,它也可以创建,@Jens 非常感谢你帮助我 :)
  • 最后一个疑问,如果我在两个不同的 aws 帐户中拥有源存储桶和目标存储桶,需要进行哪些更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2019-03-30
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2019-01-16
  • 2020-06-22
相关资源
最近更新 更多