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}});
我正在 运行 使用 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}});