AWS Lambda 调用函数并不总是 return

AWS Lambda invoke function doesn't always return

我正在 运行 使用 Node 4.3 as a runtime. I am invoking my function from my webapp code with the node aws-sdk 为 image/video 处理一个 AWS Lambda 函数。

问题是,当函数执行时间过长(例如 250 秒)时,永远不会收到调用回调,尽管我可以在 aws cloudwatch 日志中清楚地看到函数执行正常。最重要的是,该函数至少再次重新 运行 两次(这可能与调用中的 maxRetries 参数有关:因为它没有得到响应,所以它会重试)。

让我感到困惑的是它适用于更快的函数,而我的 lambda 函数永远不会超时。有人有这样的问题吗?会不会跟新的4.3运行时间有关?请注意,我省略了 context.succeed()context.fail(),因为它不再需要了,但我尝试了它并没有改变任何东西。

Lambda 代码

...
var handler = function (event, context, callback) {
    // video/image processing code
    // 
    // callback function
    ..., function(err, result) {
        if (err) {
            console.log("Error", err, err.stack);
            callback(err);
        } else {
            console.log("Done");
            callback(null, result);
        }
    }
};

Lambda 调用

var lambda = new AWS.Lambda;

var myEventObject = {...};
var payload = JSON.stringify('myEventObject');

var params = {
    FunctionName: 'myLambdaFunction'
    InvocationType: 'RequestResponse',
    LogType: 'None',
    Payload: payload
};

lambda.invoke(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);           // successful response
});

Lambda CloudWatch 日志

REPORT RequestId: xxx   Duration: 206757.82 ms  Billed Duration: 206800 ms Memory Size: 1536 MB Max Memory Used: 354 MB 

如评论中所述,aws sdk 有自己的超时配置设置,默认设置为 120 秒(这是与 lambda 不同的超时设置)。

在当前情况下,由于 lambda 运行超时时间更长,SDK 假设失败并重试。

将此配置设置为 300 秒应该可以解决问题。正如 Daniel T 在评论中展示的那样,可以通过以下方式临时更改它:var lambda = new AWS.Lambda({httpOptions{timeout: 300000}});