【问题标题】:S3.putObject is not able to executeS3.putObject 无法执行
【发布时间】:2021-12-31 08:45:28
【问题描述】:
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var bucket = 'ashish-3245';
var acl = 'public-read';
var s3prefix = 'DeepSecurityEvents/';
var ext = '.json';

exports.handler = async(event, context) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    const message = event.Records[0].Sns.Message;
    console.log("records", message);

    var timestamp = event.Records[0].Sns.Timestamp;
    var date = getFormattedDate(new Date(timestamp));
    console.log('from date', date);

    //add 5 random digits to prevent overwriting an existing file if two messages are received at the same ms.
    var random5digits = Math.floor(Math.random() * 90000) + 10000;
    //ie. DeepSecurityEvents/2016/07/20/2016-07-20T15:30:00.000Z12345.json
    var filename = s3prefix + date + '/' + timestamp + random5digits + ext;


    putObjectToS3(message, filename);
    console.log('From S3:', message);
    console.log(filename);

};

function getFormattedDate(d) {
    //returns yyyy/MM/dd
    return d.getFullYear() + '/' + twoDigits(d.getMonth() + 1) + '/' + twoDigits(d.getDate());
}

function twoDigits(n) {
    return n < 10 ? '0' + n : n;
}

function putObjectToS3(message, filename) {
    console.log('From async:', message);
    var params = { Bucket: bucket, Key: filename, ACL: acl, Body: message };
    s3.putObject(params, function(err, message) {
        console.log('p SNS:', message);
        if (err) console.log(err, err.stack);
        else console.log(message);
        context.done();
    });
}

输出

kkk

Response
null

Function Logs
START RequestId: 8d6f4394-9b87-49e5-bbec-ad88cf16813e Version: $LATEST
2021-11-21T11:22:16.379Z    8d6f4394-9b87-49e5-bbec-ad88cf16813e    INFO    records omly message
2021-11-21T11:22:16.380Z    8d6f4394-9b87-49e5-bbec-ad88cf16813e    INFO    from date 1970/01/01
2021-11-21T11:22:16.380Z    8d6f4394-9b87-49e5-bbec-ad88cf16813e    INFO    From async: omly message
2021-11-21T11:22:16.492Z    8d6f4394-9b87-49e5-bbec-ad88cf16813e    INFO    From S3: omly message
2021-11-21T11:22:16.505Z    8d6f4394-9b87-49e5-bbec-ad88cf16813e    INFO    DeepSecurityEvents/1970/01/01/1970-01-01T00:00:00.000Z99418.json
END RequestId: 8d6f4394-9b87-49e5-bbec-ad88cf16813e
REPORT RequestId: 8d6f4394-9b87-49e5-bbec-ad88cf16813e  Duration: 148.84 ms Billed Duration: 149 ms Memory Size: 400 MB Max Memory Used: 78 MB  Init Duration: 415.78 ms

Request ID
8d6f4394-9b87-49e5-bbec-ad88cf16813e

【问题讨论】:

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


    【解决方案1】:

    您正在使用async handler,因此您的函数在您的代码实际运行之前完成。您可以将代码包装在Promise 中,如docs 所示以解决此问题。

    【讨论】:

    • 感谢您的回复,您能告诉我应该在哪里使用promise
    【解决方案2】:

    您的处理程序是异步的,因此为了让其他异步调用(例如:putObject)能够完成您:

    1. 返回包装您的代码的承诺(请参阅@Marcin 的回答)
    2. 使用async-await 模式。为此,您必须执行以下操作:

    重构putObjectToS3 以返回promise:

    function putObjectToS3(message, filename) {
        console.log('From async:', message);
        const params = { Bucket: bucket, Key: filename, ACL: acl, Body: message };
        try {
            return s3.putObject(params).promise();
        } catch(e) {
            console.err(e);
        }
    }
    

    在 Lambda 处理程序中,我们还必须调用 putObjectToS3 和 await:

    const result = await putObjectToS3(message, filename);
    console.log('p SNS:', result);
    

    【讨论】:

    • 你的 putObjectToS3 函数没有返回承诺,或者任何事实。
    • 问题中的那个也没有。您能否详细说明为什么会出现问题?
    • 那是因为 OP 不知道如何使用 async/await。您的 putObjectToS3 函数通常是 return s3.putObject(params).promise(),调用者可以等待(或简单地作为 Lambda 函数处理程序的结果返回)。如所写,您的函数等待承诺,然后将 undefined 的隐式返回值包装在第二个承诺中,然后调用者等待。我应该在我的第一条评论中写下“不明确返回承诺”。
    • 我试图尽可能接近原始实现。由于那里没有回报,我决定保持原样,让 OP 根据需要对其进行调整。不过,我正在更新答案以返回来自 putObject 调用的响应。在这一点上,我们正在猜测 OP 中原始代码的意图是什么。我认为答案提供了一个起点,以便 OP 能够对async/await 的主题进行更多研究。
    • 原始代码没有返回任何内容(因此隐式返回代码未定义,然后由于函数是异步的,因此将其包装在 promise 中)。显式返回 Promise 的优点是清楚函数返回的内容,并避免不必要的双重等待和对 Promise 的解包/包装/解包。顺便说一句,你会 return s3.putObject(params).promise() 而不是 return await s3.putObject(params).promise()。
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2019-07-19
    相关资源
    最近更新 更多