如何在节点js lambda中使用aws s3图像url?

时间:2017-04-29 12:47:37

标签: node.js amazon-s3 aws-lambda

我正在尝试在lambda节点js中使用aws s3图像,但是它会抛出一个错误'没有这样的文件或目录'。但我已将该图像公之于众,并授予所有权限。

fs = require('fs');
exports.handler = function( event, context ) {

         var img = fs.readFileSync('https://s3-us-west-2.amazonaws.com/php-7/pic_6.png');
         res.writeHead(200, {'Content-Type': 'image/png' });
         res.end(img, 'binary');
};

3 个答案:

答案 0 :(得分:1)

fs是节点js文件系统核心模块。它用于在本地计算机上写入和读取文件。这就是为什么它会给你这个错误。

答案 1 :(得分:0)

您的代码存在多处问题。

fs是用于文件操作的核心模块,无法用于访问S3。

您似乎在示例中使用了express.js代码。在lambda中,没有定义内置res(除非您自己定义),您可以使用它来发送响应。

您需要使用context上的方法或新的callback机制。上下文方法用于较旧的lambda节点版本(0.10.42)。您应该使用较新的节点版本(4.3.2或6.10),它使用回调参数返回响应。

看起来你也在使用API​​网关,所以假设,我会给出一些建议。如果客户端需要访问S3对象,那么这些是您的一些选择:

  • 使用AWS sdk从S3读取图像,并使用适当的二进制媒体类型返回图像。 AWS最近添加了对API网关的二进制数据的支持。请参阅此link
  • 在json响应中将公共S3 URL发送到客户端。考虑S3对象是否需要公开。 OR
  • 使用S3 sdk生成pre-signed URLs,这些documentation在配置的持续时间内有效回到客户端。

我喜欢预先签名的网址方法。我想你应该检查一下。您可能还想检查AWS lambda {{3}}

答案 2 :(得分:0)

要从S3获取文件,您需要使用S3为您提供的路径。基本路径为 https://s3.amazonaws.com/ {您的存储桶名称} / {您的文件名称}

在代码上,您必须替换下一行:

  

var img = fs.readFileSync('https://s3.amazonaws.com/ {您的存储桶名称} /pic_6.png');

如果没有存储桶,则应创建一个存储桶以授予权限。