【问题标题】:AWS S3 ListObjects in Node.js Lambda FunctionNode.js Lambda 函数中的 AWS S3 ListObjects
【发布时间】:2019-01-19 01:51:16
【问题描述】:

我正在尝试从我的 node.js (8.10) lambda 函数中列出一个 S3 存储桶。

当我(在 Lambda 中)运行下面的函数时,我在日志中看到“检查点 1”和“检查点 2”,但我没有看到来自 listObjectsV2 调用的任何日志记录,既没有错误也没有数据。我的超时设置为 10 秒,我也没有看到任何超时日志条目。我想我可能会遗漏在 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");

};

有人可以指出我在这里找到错误的正确方向吗?

【问题讨论】:

  • 在打印列表之前,您的 Lambda 函数是否有可能超时? CloudWatch Logs 将显示超时。请注意,Lambda 默认执行超时为 3 秒。
  • 我没有看到任何 CloudWatch 日志条目超时。我应该在上面指出,我也将超时设置为 10 秒。
  • 你应该回报一个承诺,不是吗?

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


【解决方案1】:

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

s3.listObjectsV2(params).promise();

【讨论】:

  • 您混合了承诺和回调的概念。如果你使用 .promise() 那么你不需要提供 (err,data) 回调
【解决方案2】:

不仅需要return一个promise,还需要await就可以了,否则没有效果。这是因为您的处理程序是async,这意味着它无论如何都会返回一个承诺。这意味着如果您不等待要执行的代码,Lambda 很可能会在 promise 得到解决之前终止。

您的代码应如下所示:

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'})
    }

};

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 2021-02-22
    • 2017-03-04
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2018-08-02
    • 2018-06-08
    相关资源
    最近更新 更多