在context.fail之后,AWS Lambda函数会继续执行一些操作

我有一个简单的AWS Lambda函数,可以对保存到S3存储桶的映像进行一些validation。 我使用async.waterfall来下载图像并进行处理,但是在我进入第一个瀑布函数之前,我对从S3 PutObject触发器获得的事件数据做了一些基本的validation,特别是大小信息( event.Records[0].s3.object.size )。 如果事件引用的图像大于MAX_SIZE,则使用context.fail(new Error("Validation error: the file is too big."))来结束执行。

这一切都工作正常,但我注意到在我的日志中logging错误后,function继续运行一点之前退出。 例如,我的async.waterfall调用中的第一个函数被调用(即来自该函数的消息显示在日志中)。 我甚至尝试在context.done(errorMessage)之后立即添加一个context.done(errorMessage) ,并且它会被执行(即我传入的消息被logging下来)以及几行代码。

这是预期的行为? 在文档中我找不到任何提及的内容。 该函数是否需要一点时间才能退出,或者我误解了在async.waterfall之前的处理函数中的代码的同步性质?

以下是我的一些代码。 在context.fail之后显示的所有console.log消息都会打印到日志中,我不希望发生这种情况。

 exports.handler = function(event, context) { console.log('Received event:', JSON.stringify(event, null, 2)); if (event.Records[0].s3.object.size > MAX_FILE_SIZE) { var error = new Error("Validation error: the file is too big.") context.fail(error); } console.log('Event validation complete.') var bucket = event.Records[0].s3.bucket.name; var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); var fileName = key.split("/")[1]; var params = { Bucket: bucket, Key: key }; console.log('Starting processing of the following file: ' + JSON.stringify(params, null, 2)); async.waterfall([ function download(callback) { // Download the image from S3 into a buffer. console.log("Downloading the image from S3..."); s3.getObject(params, function(err, data) { if (err) { callback(err); } else { callback(null, data); } }); }, ... ], ...) } 

这似乎是预期的行为,即使没有很好的logging。 上下文文档确实说fail() “表示失败”,但不承诺停止进一步的执行。

context.fail()

指示Lambda函数执行,并且所有callback都不成功完成,导致处理的exception。

你的代码的好消息是,在调用context.fail()以避免进一步处理之后,从函数return应该相当容易。

我相信自从这个问题被问到(和James的回答)之后,aws lambda结构已经发生了一些变化。

现在处理程序还有第三个参数 “callback”,可以调用它来停止脚本的执行。 根据您的调用方式,它会成功退出过程或发生错误。 查看这些文档的具体信息。

此外,请查看上下文属性callbackWaitsForEmptyEventLoop 。 它的默认值为true,但是你会希望将其设置为false,这样,一旦callback被调用,节点进程就不会等待运行时循环清除,即asynchronous调用被抛弃。