【问题标题】:Nothing inside the S3 API's getObject callback is running in Lambda functionS3 API 的 getObject 回调中没有任何内容在 Lambda 函数中运行
【发布时间】:2019-03-20 09:16:27
【问题描述】:

我遇到了一个问题,我无法从 S3 读取我的文件...甚至无法进入 S3 回调。我正在为我的 lambda 使用节点 8.10,并且我已经验证了一切都在运行,直到我尝试进入 getObject —— 下面的 console.log 甚至不会运行。这里有什么看起来歪斜的吗?我已授予对 lambda 和 S3 的完全访问权限,所以我认为这不是问题。

const AWS = require('aws-sdk')

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

    const s3options = {
        accessKeyId: process.env.AWS_KEY,
        secretAccessKey: process.env.AWS_SECRET,
        apiVersion: '2006-03-01',
    }   

    const params = {
        Bucket: event.Records[0].s3.bucket.name,
        Key: event.Records[0].s3.object.key,
    }

    const s3 = new AWS.S3(s3options)    

    s3.getObject(params, (err, data) => {
        // callback(null, data.Body.toString('utf-8'))

        console.log('I am here!')
    })

}

【问题讨论】:

  • 异步函数需要返回一个承诺,不是吗? Lambda 不知道你还没有完成。
  • 嗯,我觉得自己像个工具。删除了“async”关键字,一切都很好。谢谢!

标签: node.js amazon-s3 aws-lambda aws-sdk


【解决方案1】:

如果您尝试使用 Node v8.x 的 async/await 功能,则必须将代码包装到 try/catch阻塞并使用promise(我的意思是不必包装你的函数代码,但你仍然需要在你的应用程序中实现try/catch块)。

注意:AWS-SDK 已经承诺,意味着您没有承诺 AWS-SDK 方法或使用回调。只需简单地将 .promise() 作为尾部附加到您的方法中,然后将 await 关键字作为前缀添加到您尝试调用的方法中。

例子:

之前:

s3.getObject(params, (err, data) => {
        // callback(null, data.Body.toString('utf-8'))

之后:

try 
{
    const s3Response = await s3.getObject(params).promise();

    // if succeed 
    // handle response here
}
catch (ex) 
{
    // if failed
    // handle response here (obv: ex object)
    // you can simply use logging
    console.error(ex);
}

那么您的代码必须如下所示:

// it's really cool to use ES6 syntax to import modules: import * as AWS from 'aws-sdk';
// btw, you don't have to import AWS-SDK inside the handler file

// const AWS = require('aws-sdk')

exports.handler = async (event) => {

    const s3options = 
    {
        accessKeyId: process.env.AWS_KEY,
        secretAccessKey: process.env.AWS_SECRET,
        apiVersion: '2006-03-01',
        // do not forget include a region (e.g. { region: 'us-west-1' })
    }   

    const params = 
    {
        Bucket: event.Records[0].s3.bucket.name,
        Key: event.Records[0].s3.object.key,
    }

    const s3 = new AWS.S3(s3options)    

    try 
    {
        const s3Response = await s3.getObject(params).promise();

        // if succeed 
        // handle response here
    }
    catch (ex) 
    {
        // if failed
        // handle response here (obv: ex object)
        // you can simply use logging
        console.error(ex);
    }
}

【讨论】:

  • 这就是我最终解决问题的方式。我了解了 promise() 方法,我做了类似上面的调整,我的异步 lambda 工作得很好。谢谢!
猜你喜欢
  • 2017-01-18
  • 2020-04-23
  • 2020-11-22
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2020-01-10
相关资源
最近更新 更多