2017-12-27 1363 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