2017-12-27 1511 views
-2

我試圖將AWS Lambda中的JSON文件保存到S3。 (更精確地說:我想創建一個包含S3桶'gpiocontroll-XYZ'內的「數據」的新文件'supertest.json'使用node.js將AWS Lambda中的JSON保存到AWS S3

lambda函數如下:

'use strict' 

const aws = require('aws-sdk'); 
const s3 = new aws.S3(); 

//const fs = require('fs'); 

function saveJSONtoS3(data){ 
    console.log('SAVEJSON', data); 

    var params = { 
     Bucket: 'gpiocontroll-XYZ', // your bucket name, 
     Key: 'test.txt', // path to the object you're looking for 
     Body: data 
    } 

    s3.putObject(params, function(err, data) { 
     // Handle any error and exit 
     if (err) 
     console.log('ERROR', err); 
     else { 
      console.log('UPLOADED SUCCESS'); 
     } 
     console.log('INSIDE FUNCTION'); 
    }); 

    console.log('END') 
} 

module.exports = { 
    saveJSONtoS3 : saveJSONtoS3 
} 

上LAMBDA日誌看起來像:

2017-12-27T20:04:29.382Z 255d436d-eb41-11e7-b237-1190c4f33d2d SAVEJSON {"table":[{"pin":"1","state":"aus"}]} 
2017-12-27T20:04:29.402Z 255d436d-eb41-11e7-b237-1190c4f33d2d END 
END RequestId: 255d436d-eb41-11e7-b237-1190c4f33d2d 
REPORT RequestId: 255d436d-eb41-11e7-b237-1190c4f33d2d Duration: 362.29 ms Billed Duration: 400 ms  Memory Size: 128 MB Max Memory Used: 43 MB 

所以它看起來一切都很好,但s3.putObject功能只是不被觸發。 Lambda和S3都在同一地區。 S3公開了IAM用戶。我是否需要以某種方式登錄Lambda函數?

非常感謝!

+0

沒有's3.putObject'通話有 – hjpotter92

+0

對不起。只更新了示例代碼。 – luckybusted

+2

這不是AWS Lambda函數。 – dashmug

回答

0

正如@dashmug說,你的例子是 lambda函數。

必須exports.handler在您的文件的某處,除非在功能配置中指定。

所有的Lambda函數首先調用exports.handler,(event, context, callback)參數。這些包括event或動作的數據,一些額外的context以及成功/失敗callback

這裏是你在找什麼:

更新:改變S3.putObject無極包裹功能S3.putObject().promise()@dashmug’s建議。

需要AWS SDK對JavaScript(V2.3.0 - 2016年3月31日或以後)

'use strict'; 

const 
    AWS = require('aws-sdk'), 
    S3 = new AWS.S3(); 

exports.handler = (event, context, callback) => { 
    console.log(`FUNCTION STARTED: ${new Date()}`); 

    S3.putObject({ 
     Bucket: 'gpiocontroll-XYZ', 
     Key: 'test.txt', 
     Body: 'stuff' 
    }) 
     .promise() 
     .then(() => console.log('UPLOAD SUCCESS')) 
     .then(() => callback(null, 'MISSION SUCCESS')) 
     .catch(e => { 
      console.error('ERROR', e); 
      callback(e); 
     }); 
}; 

注:必須給lambda函數IAM權限的S3存儲你正試圖訪問。在上述情況下,您的IAM角色應該是這個樣子:

{ 
    "Effect": "Allow", 
    "Action": [ "s3:PutObject" ], 
    "Resource": [ 
     "arn:aws:s3:::gpiocontroll-XYZ/*" 
    ] 
} 
+0

Lambda函數不必被命名爲'handler'。我通常清楚地命名它們(例如'api','graphql','worker'等)。另外,使用'module.exports'很好(相對於簡單的'exports')。 – dashmug

+2

您可以使用s3.putObject(params).promise()'來代替您的Promise包裝。它看起來會更乾淨。 – dashmug

+0

噢!忘記他們補充說。謝謝 – iSkore