【问题标题】:AWS Lambda Function not running to completionAWS Lambda 函数未运行完成
【发布时间】:2020-01-04 00:47:27
【问题描述】:

我有一个 AWS Lambda 函数,它采用 ZipCode 并查找半径内的位置。返回的每个位置都会通过一系列业务流程对其进行进一步处理。我的测试数据由每个请求返回的 24 个位置组成。每个请求都有一个 guid,代表我在代码中添加 console.log 语句的请求,以便我可以通过 CloudWatch 日志了解正在发生的事情。

每当我运行 lambda 函数时,CloudWatch 日志都会在进程完成之前结束。随后,我使用不同的 Guid 向 Lambda 发出另一个请求,我在 CLoudWatch 日志中看到上一个请求的条目。

CloudWatch 为何没有在整个过程中保持活动状态并捕获日志条目? - 我假设 Lambda 函数在 CloudWatch Log 中出现“结束”时立即结束。

先前请求中的日志条目为何会与后续请求混在一起?

更新

包含 24 个位置的数据结构来自 async 方法。 24 个位置中的每一个都是一个任务。因为 async 是对未来结果的承诺,lambda 函数是否可能在 async 之前关闭使满意?这可以解释为什么在注册“结束”之前,CLoudWatch 日志中只输出了 24 个位置中的少数几个。在“结束”事件发生之前处理/记录了 24 个中的多少并没有一致性。随后的调用似乎从原始调用中获得了余额。

【问题讨论】:

  • 您在请求之间等待了多长时间? CWL 大约需要 20 秒才能显示出来。它们是否具有相同的请求 ID 或不同(即旧的 CW 日志是否显示与新请求相同的请求 ID?)
  • 对 Lambda 函数的每个请求都是不同的 Guid。有时我会在 30 秒内执行第二个或第三个后续请求。其他时候我会不管它。我会后悔 CWL,但它没有显示更新。一段时间后,我将发出一个新请求,然后 CWL 更新,我看到 CWL 中基于请求 ID 的条目混合包。
  • 标题听起来有误导性。您的问题不只是日志没有及时出现在 CloudWatch Logs 中吗?

标签: amazon-web-services aws-lambda amazon-cloudwatch amazon-cloudwatchlogs


【解决方案1】:

我发现了这个问题。我遇到的问题与在我的代码中使用任务有关。任务是在未来某个时间点接收数据的承诺。我很确定我的 Lambda 函数在所有任务实现之前就退出了。我添加了以下内容以强制我的 Lambda 等到所有任务完成:

...

var futureList = new List<Task>();

foreach (var range in outerRange.TrySplit(_config.HashKeyLength))
{
    var task = RunGeoQuery(geoQueryRequest, geoQueryResult, range, cts.Token);
    taskList.Add(task);
}

Task.WhenAll(taskList).Wait();

...

添加 Task.WhenALl(taskList).Wait() 后,我的 Lambda 函数处理了所有 24 个位置并反映在 CloudWatch 日志中。

我不确定使用此方法是否会产生影响。任何见解都值得赞赏。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2022-09-27
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多