2016-04-15 100 views
2

我正在为Node 4.3 as a runtime运行用于图像/视频处理的AWS Lambda函数。我使用节点aws-sdk从我的webapp代码调用我的函数。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 
+0

我怀疑sdk的超时配置是240秒,这可能会解释你得到一个重试。你可以尝试在你的cli中改变这个配置吗? – Tom

+0

否超时配置设置为最大值:300秒。如果超过300秒,功能会超时,我可以在CloudWatch日志中看到它。如果我将超时设置为较低的值(例如30秒),则该函数返回超时错误,并捕获回调错误。 –

+2

请注意,我不是在谈论lambda的超时,而是从sdk配置的那个,你呢? – Tom

回答

4

一个s在注释中声明,aws sdk拥有自己的超时配置设置,即默认设置为120秒(这是一个不同于lambda的超时设置)。

在当前情况下,由于lambda运行更多此超时,sdk假设失败并触发重试。

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