【问题标题】:Save a JSON from AWS Lambda to AWS S3 with node.js使用 node.js 将 JSON 从 AWS Lambda 保存到 AWS S3
【发布时间】:2018-06-08 10:49:43
【问题描述】:

我正在尝试将 JSON 文件从 AWS Lambda 保存到 S3。 (更准确地说:我想创建一个新文件 'supertest.json',其中包含 S3 存储桶 'gpiocontroll-XYZ' 内的“数据”)

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 函数?

非常感谢!

【问题讨论】:

  • 那里没有s3.putObject的电话
  • 对不起。刚刚更新了示例代码。
  • 这不是 AWS Lambda 函数。

标签: javascript node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

正如@dashmug 所说,您的示例不是 Lambda 函数。

除非在函数配置中指定,否则您必须在文件中的某处有exports.handler

所有 Lambda 函数都以使用 ( event, context, callback ) 参数调用 exports.handler 开始。其中包括event 或操作的数据、一些额外的context 和成功/失败callback

这是您要查找的内容:

更新:根据@dashmug’s 的建议将S3.putObject Promise 包装函数更改为S3.putObject().promise()

需要适用于 JavaScript 的 AWS 开发工具包(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 );
         } );
};

注意:必须向您尝试访问的 S3 存储桶授予 Lambda 函数 IAM 权限。在上述情况下,您的 IAM 角色应如下所示:

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

【讨论】:

  • Lambda 函数不必命名为handler。我通常会清楚地命名它们(例如apigraphqlworker 等)。此外,module.exports 的使用也很好(与简单的 exports 相比)。
  • 您可以改用 s3.putObject(params).promise() 来摆脱 Promise 包装器。它看起来会干净得多。
  • 哦耶!忘了他们加了。谢谢
  • @dashmug 和 iSkore 首先:非常感谢。但是我发布的功能似乎有效。 (见日志)。正在记录“数据”和“结束”。如果参数中的某些内容有误,我也会收到错误消息。唯一奇怪的是,我没有从 putObject 函数中得到任何日志...
  • 刚刚检查了您的建议并获得了完全相同的日志:2017-12-28T07:31:02.663Z 0dee436e-eba1-11e7-a45b-17d92e2998bb SAVEJSON {"table":[{"pin":"1","state":"aus"}]} 2017-12-28T07:31:03.146Z 0dee436e-eba1-11e7-a45b-17d92e2998bb END 他只是跳过了“putObject”。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2019-04-28
  • 1970-01-01
  • 2018-12-15
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多