javascript 如何在 Lambda 中将对象上传到 S3?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30927172/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 12:56:42  来源:igfitidea点击:

How to upload an object into S3 in Lambda?

javascriptamazon-web-servicesamazon-s3aws-lambda

提问by Edwin

Can't seem to upload an object into S3 in Lambda. Everything works fine locally. No errors in logs that would show what's going wrong...

似乎无法在 Lambda 中将对象上传到 S3。在本地一切正常。日志中没有错误可以显示出了什么问题......

Code below:

代码如下:

console.log('Loading function');
var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.handler = function(event, context) {
    //console.log(JSON.stringify(event, null, 2));
    var s3 = new AWS.S3();
    var param = {Bucket: 'flow-logs', Key: 'test-lambda-x', Body: 'me me me'};
    console.log("s3");
    s3.upload(param, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log(data);           // successful response
    });
    console.log('done');
    context.done();
};

Runs successfully w/o error, but the callback in s3.upload doesn't seem to be called. No object in bucket is created.

运行成功,没有错误,但 s3.upload 中的回调似乎没有被调用。没有创建存储桶中的对象。

Verified IAM role permissions weren't a problem by granting full access, as well as testing out locally.

通过授予完全访问权限以及在本地进行测试,经过验证的 IAM 角色权限不是问题。

Output

输出

START RequestId: d4847fdb-160c-11e5-8a8c-b555b123e14d
2015-06-18T22:53:29.750Z    d4847fdb-160c-11e5-8a8c-b555b123e14d    s3
2015-06-18T22:53:30.271Z    d4847fdb-160c-11e5-8a8c-b555b123e14d    done
END RequestId: d4847fdb-160c-11e5-8a8c-b555b123e14d

回答by James

I suspect you are calling the context.done()function before s3.upload()has a chance to return. If you move context.done()into the upload response code block, it should work.

我怀疑您context.done()s3.upload()有机会返回之前调用了该函数。如果您context.done()进入上传响应代码块,它应该可以工作。

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

exports.handler = function(event, context) {
    //console.log(JSON.stringify(event, null, 2));
    var s3 = new AWS.S3();
    var param = {Bucket: 'flow-logs', Key: 'test-lambda-x', Body: 'me me me'};
    console.log("s3");
    s3.upload(param, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log(data);           // successful response

        console.log('actually done!');
        context.done();
    });

    console.log('done?');
    //context.done();
};