这是我的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语法具有误导性。问题是,您同时使用callback
和async
。要正确使用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)
}
};
希望这能有所帮助。