当前位置: 首页 > 知识库问答 >
问题:

无法获取Lambda函数以读取S3对象内容

乌骏
2023-03-14

我有一个AWS Lambda函数,它与IAM角色一起部署,可以“完全访问”Lamba、S3和Cloudwatch资源。它在很大程度上起作用。

我在函数入口点js.js中包含了一个npm模块。我的目标是让函数读取<代码>的内容。json文件上传到bucket后。我为Lambda函数创建了一个触发器,用于在存储桶的S3 PUT操作中执行此操作。

这是我使用的代码,主要来自另一个StackOverflow答案。部署时,一切似乎都正常-

以下是我使用的代码:

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 SDK模块没有上传到Lambda,日志不会报告错误吗?任何关于故障排除的建议,以便我能够理解为什么我不能读取存储桶对象,我们都很感激。

共有1个答案

秦钟展
2023-03-14

问题是s3.getObject方法似乎根本没有启动。

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

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

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

 类似资料:
  • 因此,我尝试使用Amazon Textract读取多个pdf文件,使用方法读取多个页面,如下所示: 在尝试从中检索响应对象时,我可以看到它被打印出来: 相应地,我将使用该稍后访问对象。但是我得到了以下错误,我不明白: InvalidS3ObjectException:调用StartDocumentTextDetection操作时发生错误(InvalidS3ObjectException):无法从S

  • 我想在我的AWS Lambda函数(python 3.6环境)中获得S3桶对象标签。我在本地环境中成功获得对象标签,但当我在AWS lambda函数中运行时,我收到错误: “errorMessage”:“调用GetObjectTagging操作时发生错误(AccessDenied):拒绝访问” 虽然我已经用s3桶和对象上的所有写入创建了IAM角色。 IAM角色策略: 代码是:

  • 我正在尝试访问存储在AWS3桶中的文本文件。目前,它只包含“测试”一词。 起初,我以为我的fs.readfile有问题,但现在我发现问题更根本。我根本无法访问该文件。node.js的AWS似乎根本无法看到该文件。 我正在使用以下Lambda函数: 测试床函数包含以下代码: 结果如下所示(我删除了时间戳和请求ID文本): 由此,我得出结论,没有调用S3函数,尽管我可能弄错了。 我做错了什么?

  • 我在Lambda函数上收到来自S3 AWS服务的acccess denied错误。 这是代码: 这是CloudWatch上的错误: 这是堆栈错误: 没有关于S3的任何其他描述或信息,桶权限允许每个人、放置、列表和删除。 我可以做什么来访问S3桶? PS:在Lambda事件属性上,主体是正确的,并且具有管理特权。

  • 我试图弄清楚是否有可能返回某种流(可能是内存流?)我从我的桶里得到的东西。 S3 bucket包含很多不同类型的图像、文档等。所有这些都应该在我的网站上使用。但是,我不想显示AWS S3存储桶的路径 这就是为什么我试图创建一个流,并动态显示图像和可下载文档,而不是使用完整路径。这有意义吗?:-) 我用的是C#/。NET AWS SDK。 期待听到任何想法和方向指向!

  • 我试图将值从数据库快照放入类对象的映射活动代码。 我的车站类别代码和位置类别代码。 在从firebase获取的地图上标记位置的代码。