2016-10-22 423 views
19

我在AWS中有一个Node 4.3 Lambda函数。我希望能够向S3编写一个文本文件,并阅读了许多关于如何与S3集成的教程。然而,所有这些都是关于如何调用lambda函数编写后,S3象下面这样:AWS Lambda函数写入S3

http://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

如何创建在S3从LAMBDA使用节点的文本文件?这可能吗?亚马逊的文件似乎没有涵盖它。

回答

36

是的,这是绝对可能的!

var AWS = require('aws-sdk'); 
function putObjectToS3(bucket, key, data){ 
    var s3 = new AWS.S3(); 
     var params = { 
      Bucket : bucket, 
      Key : key, 
      Body : data 
     } 
     s3.putObject(params, function(err, data) { 
      if (err) console.log(err, err.stack); // an error occurred 
      else  console.log(data);   // successful response 
     }); 
} 

确保你给你的lambda函数所需的写入权限目标S3存储/关键路径选择或更新IAM角色的拉姆达下执行。

IAM声明补充:

{ 
    "Sid": "Stmt1468366974000", 
    "Effect": "Allow", 
    "Action": "s3:*", 
    "Resource": [ 
     "arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*" 
    ] 
} 

延伸阅读:

AWS的JavaScript SDK: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

特定的 “将对象” 的详细信息: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

+0

如果你的lambda函数是一个VPC内执行,你将不得不为它创建一个终结点。在找出之前,s3.putObject的回调从未被调用过。 请参阅关于S3 VPC端点的文章:https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/ 请参阅关于从lambda:https:/ /aws.amazon.com/blogs/aws/new-access-resources-in-a-vpc-from-your-lambda-functions/ – vtellier

3

如果您正在使用IAM用户,那么你必须提供访问密钥和秘密密钥,并确保你提供必要的许可,您可以使用

AWS-SDK

上传在S3上的文件到IAM用户。

var AWS = require('aws-sdk'); 
AWS.config.update({accessKeyId: "ACCESS_KEY",secretAccessKey: 'SECRET_KEY'}); 
var s3bucket = new AWS.S3({params: {Bucket: 'BUCKET_NAME'}}); 
function uploadFileOnS3(fileName, fileData){ 
    var params = { 
     Key: fileName, 
     Body: fileData, 
    }; 
    s3bucket.upload(params, function (err, res) {    
     if(err) 
      console.log("Error in uploading file on s3 due to "+ err) 
     else  
      console.log("File successfully uploaded.") 
    }); 
} 

在这里,我暂时硬编码的AWS访问和测试purposes.for最佳实践密钥参考以下链接。

https://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html

+3

问题中没有任何内容特别要求访问密钥和秘密用于身份验证。以这种方式进行身份验证是非常糟糕的做法,因此我不认为这是一个明智的解决方案。应为Lambda函数配置IAM角色,该角色足以满足Lambda函数执行其功能所需的访问。 –

+0

我知道我只是把秘密密钥和访问密钥硬编码,但这种方法只适用于小型个人脚本或用于测试目的。 –