我正在运行在 AWS Lambda 上执行长时间操作的 Meteor(节点 4.4.7)应用程序。我从我的代码中调用 lambda 函数并在继续下一次调用之前等待响应。我将超时设置为 300000 毫秒,如前一个问题中所述(在我的代码中的 Lambda 和 AWS.Lambda 对象中)。
我的问题是有时AWS.Lambda超时值会重置为默认值 120000 毫秒。由于我的 Lambda 函数需要更多时间来执行(但仍然少于最大 300 秒),我没有收到响应。此外,我看到我的函数按照默认值被调用了 3 次以上maxRetries值,甚至认为我将它设置为 1。
我不知道重现它的步骤。似乎是随机的。它通常在运行我的应用程序几天后发生。如果我检查AWS.Lambda对象的属性,它仍然具有 300000 毫秒的超时值,尽管它的行为类似于具有默认的 120000 毫秒值。一旦发生这种情况,所有后续调用请求都会出现相同的问题,我必须重新启动应用程序才能使其再次运行。
请注意,在 Lambda 日志中,我看到函数正在正确执行。Duration < 120s 在我的代码中返回。重试持续时间 > 120 秒。
示例代码:
var options = {
maxRetries: 1,
httpOptions: {
timeout: 300000
}
};
var lambda = new AWS.Lambda(options);
var myEventObject = {...};
var payload = JSON.stringify('myEventObject');
var params = {
FunctionName: 'myLambdaFunction' …Run Code Online (Sandbox Code Playgroud) 我使用Node 4.3作为运行时运行AWS Lambda函数进行图像/视频处理.我正在使用节点aws-sdk从我的webapp代码调用我的函数.
问题是当函数需要很长时间执行(例如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);
}
}
};
Run Code Online (Sandbox Code Playgroud)
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, …Run Code Online (Sandbox Code Playgroud)