简体   繁体   English

Node.js Lambda函数中的AWS S3 ListObjects

[英]AWS S3 ListObjects in Node.js Lambda Function

I am attempting to list an S3 bucket from within my node.js (8.10) lambda function. 我正在尝试从我的node.js(8.10)lambda函数中列出一个S3存储桶。

When I run the function below (in Lambda), I see "Checkpoint 1" and "Checkpoint 2" in my logs, but I don't see any logging from the listObjectsV2 call, neither error nor data. 当我运行下面的函数(在Lambda中)时,我在日志中看到“检查点1”和“检查点2”,但没有看到来自listObjectsV2调用的任何日志记录,既没有错误也没有数据。 My timeout is set to 10 seconds and I am not seeing any log entries for timeouts, either. 我的超时设置为10秒,并且我也没有看到任何超时日志条目。 I think I may missing something about using asynchronous functions in lambda? 我想我可能会错过有关在lambda中使用异步函数的某些知识?

const AWS = require('aws-sdk');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});

exports.handler = async (event, context) => {

    // console.log('Received event:', JSON.stringify(event, null, 2));

    var params = { 
        Bucket: 'bucket-name'
    }

    console.log("Checkpoint 1");

    s3.listObjectsV2(params, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
        }
    });


    console.log("Checkpoint 2");

};

Can someone point me in the right direction for finding my error here? 有人可以指出正确的方向,以便在这里找到我的错误吗?

Not only you need to return a promise, you also need to await on it, otherwise it has no effect. 不仅您需要退还诺言,还需要await它,否则它没有效果。 This is because your handler is async , meaning it will return a promise anyways. 这是因为您的处理程序是async ,这意味着无论如何它将返回一个Promise。 This means that if you don't await on the code you want to execute, it's very likely that Lambda will terminate before the promise is ever resolved. 这意味着,如果您不等待要执行的代码,则Lambda很可能会在兑现承诺之前终止。

Your code should look like this: 您的代码应如下所示:

const AWS = require('aws-sdk');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});

exports.handler = async (event, context) => {

    // console.log('Received event:', JSON.stringify(event, null, 2));

    var params = { 
        Bucket: 'bucket-name'
    }

    console.log("Checkpoint 1");

    let s3Objects

    try {
       s3Objects = await s3.listObjectsV2(params).promise();
       console.log(s3Objects)
    } catch (e) {
       console.log(e)
    }


    console.log("Checkpoint 2");

    // Assuming you're using API Gateway
    return {
        statusCode: 200,
        body: JSON.stringify(s3Objects || {message: 'No objects found in s3 bucket'})
    }

};

AWS SDK可以返回承诺,只需将.promise()添加到您的函数中即可。

s3.listObjectsV2(params).promise();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM