2016-10-22 421 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

我知道我只是把祕密密鑰和訪問密鑰硬編碼,但這種方法只適用於小型個人腳本或用於測試目的。 –