AWS lambda 函数在超时错误后停止工作
AWS lambda function stops working after timed out error
我有一个简单的 lambda 函数,它异步进行 API 调用,然后 returns 数据。 99% 的情况下这都很好用。当 API 花费的时间比 lambda 配置的超时时间长时,它会按预期给出错误。现在的问题是,当我对 lambda 函数进行任何后续调用时,它会永久给我超时错误。
"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds"
为了测试情况是否如此,我将 lambda 超时设置为 3 秒,并有办法在 lambda 中触发这两个函数。
Javascript
function now() {
return response.tell('success');
}
function wait() {
setTimeout(function() { return response.tell('success'); }, 4000);
}
当我调用now
函数时没有问题。当我调用 wait
函数时,我收到超时错误,然后对 now
的任何后续调用都会给我同样的错误。
这是预期的行为吗?我认为对 lambda 函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但宁愿不这样做。
好吧,如果您在函数配置中定义了 3 秒,此超时将覆盖代码中的时间,因此请确保从您的 lambda 函数配置中增加超时并再次尝试 wait(),它应该可以工作!
您应该查看您的 函数句柄 如何与特定的
context.callbackWaitsForEmptyEventLoop
如果布尔类型是 false
,setTimeout 将永远不会触发,因为您可能 answered/handled 更早的 lambda 调用。
但是,如果 callbackWaitsForEmptyEventLoop
的值为 true
- 那么您的代码将执行您正在寻找的操作。
此外 - 直接通过回调处理所有事情可能更容易,不需要 "hand-written" 超时、更改配置超时等等...
例如
function doneFactory(cb) { // closure factory returning a callback function which knows about res (response)
return function(err, res) {
if (err) {
return cb(JSON.stringify(err));
}
return cb(null, res);
};
}
// you're going to call this Lambda function from your code
exports.handle = function(event, context, handleCallback) {
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
doSomeAsyncWork(event, context, doneFactory(handleCallback));
};
在 Amazon 控制台 AWS 配置中,您必须将默认超时从 3 秒更改为更多(最多 5 分钟)
我已经 运行 遇到了同样的问题,实际上有很多情况下 Lambda 变得没有响应,例如:
解析无效json:
exports.handler = function(event, context, callback)
{
var nonValidJson = "Not even Json";
var jsonParse = JSON.parse(nonValidJson);
正在访问 属性 未定义的变量:
exports.handler = function(event, context, callback)
{
var emptyObject = {};
var value = emptyObject.Item.Key;
访问 RDS 后未关闭 mySql 连接导致 Lambda 超时,然后变得无响应。
当我说无响应时,它实际上什至没有加载,即没有打印处理程序中的第一个打印,并且 Lambda 只是在每个 运行 退出并超时:
exports.handler = function(event, context, callback)
{
console.log("Hello there");
这是一个错误,AWS 团队知道了将近一年:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0
不幸的是,它仍然没有修复,经过一些测试后发现实际上 Lambda 试图重新启动(重新加载容器?),只是时间不够。如果您将超时设置为 10 秒,在大约 4 秒的执行时间后,Lambda 开始工作,然后在接下来的 运行 秒内开始正常运行。我也尝试过设置:
context.callbackWaitsForEmptyEventLoop = false;
并将所有 'require' 块放入处理程序中,但没有任何效果。防止 Lambda 死机的唯一方法是设置更大的超时时间,10 秒应该足以作为针对此错误的解决方法保护。
我只需要增加超时时间,错误就消失了。
我将它增加到 5 秒。
这对我来说没问题,因为我不会在生产中使用这个 Lambda。
我认为问题是因为我们在 AWS RDS 入站/出站中提到的 ip 地址。
如果您现在正在测试并且您的 node.js 在本地 ide 而不是 AWS 上工作,那么您必须执行以下操作:
转到 AWS RDS。
单击数据库实例。
- 单击该数据库实例的名称。
- 转到下面的 "Connect" 部分,您可以在其中找到安全组角色。
- 安全组的类型将是入站、出站。
- 一一点击。它将打开一个新的 window.
- 再次出现入站和出站两个选项卡。
- 一个接一个地点击。
- 点击"Edit"。
- Select "Anywhere" 而不是 "Custom"。 P.S。对 inbound/outbound.
重复
全部设置。
我有一个简单的 lambda 函数,它异步进行 API 调用,然后 returns 数据。 99% 的情况下这都很好用。当 API 花费的时间比 lambda 配置的超时时间长时,它会按预期给出错误。现在的问题是,当我对 lambda 函数进行任何后续调用时,它会永久给我超时错误。
"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds"
为了测试情况是否如此,我将 lambda 超时设置为 3 秒,并有办法在 lambda 中触发这两个函数。
Javascript
function now() {
return response.tell('success');
}
function wait() {
setTimeout(function() { return response.tell('success'); }, 4000);
}
当我调用now
函数时没有问题。当我调用 wait
函数时,我收到超时错误,然后对 now
的任何后续调用都会给我同样的错误。
这是预期的行为吗?我认为对 lambda 函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但宁愿不这样做。
好吧,如果您在函数配置中定义了 3 秒,此超时将覆盖代码中的时间,因此请确保从您的 lambda 函数配置中增加超时并再次尝试 wait(),它应该可以工作!
您应该查看您的 函数句柄 如何与特定的
context.callbackWaitsForEmptyEventLoop
如果布尔类型是 false
,setTimeout 将永远不会触发,因为您可能 answered/handled 更早的 lambda 调用。
但是,如果 callbackWaitsForEmptyEventLoop
的值为 true
- 那么您的代码将执行您正在寻找的操作。
此外 - 直接通过回调处理所有事情可能更容易,不需要 "hand-written" 超时、更改配置超时等等...
例如
function doneFactory(cb) { // closure factory returning a callback function which knows about res (response)
return function(err, res) {
if (err) {
return cb(JSON.stringify(err));
}
return cb(null, res);
};
}
// you're going to call this Lambda function from your code
exports.handle = function(event, context, handleCallback) {
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
doSomeAsyncWork(event, context, doneFactory(handleCallback));
};
在 Amazon 控制台 AWS 配置中,您必须将默认超时从 3 秒更改为更多(最多 5 分钟)
我已经 运行 遇到了同样的问题,实际上有很多情况下 Lambda 变得没有响应,例如:
解析无效json:
exports.handler = function(event, context, callback) { var nonValidJson = "Not even Json"; var jsonParse = JSON.parse(nonValidJson);
正在访问 属性 未定义的变量:
exports.handler = function(event, context, callback) { var emptyObject = {}; var value = emptyObject.Item.Key;
访问 RDS 后未关闭 mySql 连接导致 Lambda 超时,然后变得无响应。
当我说无响应时,它实际上什至没有加载,即没有打印处理程序中的第一个打印,并且 Lambda 只是在每个 运行 退出并超时:
exports.handler = function(event, context, callback)
{
console.log("Hello there");
这是一个错误,AWS 团队知道了将近一年:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0
不幸的是,它仍然没有修复,经过一些测试后发现实际上 Lambda 试图重新启动(重新加载容器?),只是时间不够。如果您将超时设置为 10 秒,在大约 4 秒的执行时间后,Lambda 开始工作,然后在接下来的 运行 秒内开始正常运行。我也尝试过设置:
context.callbackWaitsForEmptyEventLoop = false;
并将所有 'require' 块放入处理程序中,但没有任何效果。防止 Lambda 死机的唯一方法是设置更大的超时时间,10 秒应该足以作为针对此错误的解决方法保护。
我只需要增加超时时间,错误就消失了。 我将它增加到 5 秒。 这对我来说没问题,因为我不会在生产中使用这个 Lambda。
我认为问题是因为我们在 AWS RDS 入站/出站中提到的 ip 地址。
如果您现在正在测试并且您的 node.js 在本地 ide 而不是 AWS 上工作,那么您必须执行以下操作:
转到 AWS RDS。
单击数据库实例。
- 单击该数据库实例的名称。
- 转到下面的 "Connect" 部分,您可以在其中找到安全组角色。
- 安全组的类型将是入站、出站。
- 一一点击。它将打开一个新的 window.
- 再次出现入站和出站两个选项卡。
- 一个接一个地点击。
- 点击"Edit"。
- Select "Anywhere" 而不是 "Custom"。 P.S。对 inbound/outbound. 重复
全部设置。