【问题标题】:AWS Lambda invoke function doesn't always returnAWS Lambda 调用函数并不总是返回
【发布时间】:2016-08-07 11:58:51
【问题描述】:

我正在使用 Node 4.3 as a runtime 运行用于图像/视频处理的 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);
        }
    }
};

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 

【问题讨论】:

  • 我怀疑 sdk 的超时配置是 240 秒,这可以解释你得到重试。您可以尝试在您的 cli 中更改此配置吗?
  • 没有将超时配置设置为最大值:300 秒。如果超过 300 秒,功能就会超时,我可以在 cloudwatch 日志中看到它。如果我将超时设置为一个较低的值,比如 30 秒,该函数会返回一个超时错误,并且我会捕获回调错误。
  • 请注意,我说的不是 lambda 的超时,而是来自 sdk 配置的超时,你也这样吗?
  • 哦,对不起,我的错。在查看 aws 文档时,我确实错过了这个设置。它通过添加适当的选项来添加默认为120000:var lambda = new AWS.Lambda({httpOptions{timeout: 300000}}); 987654328 @非常感谢您的 span>
  • 乐于提供帮助 :) 将此评论作为未来潜在读者的答案

标签: javascript node.js aws-sdk aws-lambda


【解决方案1】:

如 cmets 中所述,aws sdk 有自己的超时配置设置,默认设置为 120 秒(这是与 lambda 设置不同的超时设置)。

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

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

【讨论】:

  • 默认重试多少次?除非成功?这种情况看起来与我在这里发生的情况非常相似stackoverflow.com/questions/36648377/… 我已经设置了超时,但也许应该更长。最糟糕的是,没有从 aws-sdk 记录超时发生的信息,它会再次尝试调用。
  • 我觉得可以在ClientConfiguration中配置(属性maxErrorRetry)。见docs.aws.amazon.com/general/latest/gr/api-retries.html
  • 调试你并在本地执行 lambda,在本地启动它实际上是通过 RPC 服务器公开它。或者您也可以使用 sam,它也可能通过 rpc 调用 docs.aws.amazon.com/serverless-application-model/latest/…
  • 问题是我写的这个 lambda 正在与外部源连接,这些源将我们的 aws env 列入白名单,而我们的本地 env 没有。我刚刚与 lambda 一起重新部署了调用服务 - 将超时更改为比可能的 lambda 超时长一分钟。结果是 lambda 做了它应该做的,甚至到达了 return 关键字,但是调用服务没有收到我们需要的有效负载的响应,而是尽管 lambda 日志记录它返回值,但它仍然超时。早些时候它会再次触发 lambda,但我使用了将 maxEntries 设置为 0。
  • 您有问题的链接吗?您在初始评论中粘贴的实际上是此页面
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多