首页 > 解决方案 > AWS Lambda nodeJS 超时,不知道为什么。日志没用

问题描述

这是我不起眼的 NodeJS 函数,它在 5 分钟后超时。CloudWatch Logs 没有给我任何关于发生了什么的细节,只是它超时了。

const AWS = require('aws-sdk');
const util = require('util');
const simpleParser = require('mailparser').simpleParser;
const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = {
        Bucket: srcBucket,
        Key: srcKey
    };
    console.log(params)
    var data = await s3.getObject(params).promise();
    console.log(data)

};

执行环境节点 12,5 分钟超时。我已经验证了正确的 s3 触发器输入,并且代码可以在我的本地 nodeJS 环境中运行。

在执行角色中,除了厨房水槽之外,我几乎添加了所有内容 - AmazonRDSFullAccess AmazonS3FullAccess CloudWatchLogsFullAccess AmazonRDSDataFullAccess AmazonVPCFullAccess AWSLambdaExecute AWSLambdaVPCAccessExecutionRole AWS 托管策略

非常感谢任何帮助,此时我失去了理智。

标签: node.jsamazon-s3aws-lambda

解决方案


因为您的 lambda 语法具有误导性。问题是,您同时使用callbackasync。要正确使用异步,请从参数中删除回调。

exports.handler = async (event) => {

  try {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = {
      Bucket: srcBucket,
      Key: srcKey
    };
    console.log(params)
    var data = await s3.getObject(params).promise();
    console.log(data)
  } catch (err) {
    console.log(err)
  }
};

AWS lambda 仍然支持回调样式处理程序。因此,您的语法不正确。但是,如果您定义了回调,则应在函数执行结束时调用回调。

由于未在函数配置的超时期限内(在本例中为 5 分钟)调用回调,因此您将获得超时。

这是回调版本。

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

  try {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = {
      Bucket: srcBucket,
      Key: srcKey
    };
    console.log(params)
    var data = await s3.getObject(params).promise();
    callback(null, 'completed successfully')
  } catch (err) {
    console.log(err)
    callback(err)
  }
};

希望这可以帮助。


推荐阅读