AWS Lambda nodeJS 超时,无法找出原因。日志无用



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

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环境中工作。

在执行角色中,除了厨房水槽,我几乎什么都加了——AmazonRDSFullAccessAmazonS3FullAccessCloudWatchLogsFullAccessAmazonRDSDataFullAccessAmazonVPCFullAccessAWSLambda执行AWSLambdaVPCA访问执行角色AWS管理的策略

我非常感谢任何帮助,在这一点上我失去了理智。

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

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)
}
};

希望这能有所帮助。

最新更新