【问题标题】:Cannot get Lambda function to read S3 object contents无法让 Lambda 函数读取 S3 对象内容
【发布时间】:2021-09-07 10:28:41
【问题描述】:

我使用 IAM 角色部署了一个 AWS Lambda 函数,该角色对 Lamba、S3 和 Cloudwatch 资源具有“完全访问权限”。它在大多数情况下都有效。

我在函数入口点index.js 中包含了一个npm 模块aws-sdk。我的目标是让函数在上传到存储桶后读取.json 文件的内容。我为 Lambda 函数创建了一个触发器,以便对存储桶的 S3 PUT 操作执行此操作。

这是我正在使用的代码,大部分来自another StackOverflow answer。当我部署时,一切似乎都正常——我可以获取上传到存储桶的 json 文件的名称,并将其打印到 Cloudwatch 上的日志中,而不会出现问题。问题是s3.getObject 方法似乎根本没有触发。我什至无法记录错误消息。

这是我正在使用的代码:

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

exports.handler = async (event, context, callback) => {
    
    console.log("Incoming Event: ", event);
    
    var src_bucket = event.Records[0].s3.bucket.name;
    var src_key    = event.Records[0].s3.object.key;

    const filename = decodeURIComponent(src_key.replace(/\+/g, ' '));
    const message = `File is uploaded => ${src_bucket} -> ${filename}`;

    console.log(message);

    s3.getObject({
        Bucket: src_bucket,
        Key: src_key
    }, function(err, data) {

        console.log(`Read S3 JSON object`);

        if (err) {

            console.log(err, err.stack);
            callback(err);

        } else {

            console.log("Raw text:\n" + data.Body.toString('ascii'));
            callback(null, null);

        }

    });

};

我不确定如何进一步排除故障。我确实设置了 S3 存储桶权限,以明确让 IAM 角色对其进行读写。但这似乎并没有解决任何问题。为什么s3.getObject 方法中的函数不输出任何内容?例如,console.log(Read S3 JSON object); 行不会显示在 Cloudwatch 日志中,尽管该方法之外的 console.log 消息可以正常工作。我已确保node_modules 文件夹也已上传。如果 AWS 开发工具包模块未上传到 Lambda,日志不会报告错误吗?感谢任何有关故障排除的建议,以便我理解为什么我无法读取存储桶对象。

【问题讨论】:

  • 您的 lambda 在 VPC 中吗?
  • 不,不是,但@Marcin 的回答似乎解决了这个问题。

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


【解决方案1】:

问题在于 s3.getObject 方法似乎根本没有触发。

可能是因为您正在使用 async handler 并且您的函数在 getObject 完成之前完成。

要纠正这个问题,您可以使用new Promise 包装您的代码,如aws docs 所示,以确保它完全执行。

顺便说一句,您链接的答案使用non-async handlers,因此您也可以为此修改代码。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2018-01-09
    • 2018-12-07
    • 2021-10-14
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2021-08-29
    • 2011-12-07
    相关资源
    最近更新 更多