AWS lambda 函数在超时错误后停止工作

新手上路,请多包涵

我有一个简单的 lambda 函数,它异步进行 API 调用,然后返回数据。 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 函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但宁愿不要。

原文由 jjbskir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 607
2 个回答

您应该寻找您的 函数句柄 如何与特定的 context.callbackWaitsForEmptyEventLoop

如果该布尔类型为 false ,则永远不会触发 setTimeout,因为您可能已经回答/处理了之前的 lambda 调用。但是,如果 callbackWaitsForEmptyEventLoop 的值是 true - 那么您的代码将满足您的需求。

此外 - 直接通过回调处理所有事情可能更容易,不需要“手写”超时,更改配置超时等等……

例如

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));
};

原文由 Jakub Koral 发布,翻译遵循 CC BY-SA 3.0 许可协议

好吧,如果您在函数配置中定义了 3 秒,此超时将覆盖代码中的时间,因此请确保从您的 lambda 函数配置中增加超时并再次尝试 wait() 它应该可以工作!

原文由 A.Elnaggar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题