首页 > 解决方案 > 无法让 Lambda 函数读取 S3 对象内容

问题描述

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

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

这是我正在使用的代码,主要取自另一个 StackOverflow 答案。当我部署时,似乎一切正常——我可以获取上传到存储桶的 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(读取 S3 JSON 对象这一行);不会显示在 Cloudwatch 日志中,尽管该console.log方法之外的消息可以正常工作。我已确保该node_modules文件夹也已上传。如果 AWS 开发工具包模块未上传到 Lambda,日志不会报告错误吗?感谢任何有关故障排除的建议,以便我理解为什么我无法读取存储桶对象。

标签: node.jsamazon-web-servicesamazon-s3aws-lambda

解决方案


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

可能是因为您正在使用异步处理程序并且您的函数在完成之前getObject完成。

要纠正此问题,您可以按照aws 文档new Promise中所示包装您的代码,以确保其完全执行。

顺便说一句,您链接的答案使用非异步处理程序,因此您也可以为此修改代码。


推荐阅读