我们正在尝试在Node中创建这个lambda函数,从API中获取30天的信息,但由于信息量的原因,我们一次只能做1天。我们当前尝试这样做涉及一个函数,该函数从lambda本身中反复调用lambda的一个新实例,每次运行时从日期减去1天直到HOW_MANY_DAYS_AGO> 0.我们将信息上传到RDS数据库,然后运行计算结果的sql语句,然后将它们发布到网页。如果我们运行lambda 10天或以下,它的效果非常好。当我们尝试运行30天时,我们每次运行时都会在第11天或第12天开始出现此错误。我们已经尝试在整个代码中的不同位置设置延迟,因为我们假设事情发生得太快了。
18:27:53
2017-05-09T18:27:53.505Z e720be2f-34e4-11e7-90ca-3f2ffa915b81 { StatusCode:
200, FunctionError: 'Unhandled', Payload: '{"errorMessage":"RequestId:
3243f8d3-34e5-11e7-b0a2-df429a0d6565 Process exited before completing
request"}' }
2017-05-09T18:27:53.505Z e720be2f-34e4-11e7-90ca-3f2ffa915b81 { StatusCode:
200,
FunctionError: 'Unhandled',
Payload: '{"errorMessage":"RequestId: 3243f8d3-34e5-11e7-b0a2-df429a0d6565
Process exited before completing request"}' }
我们偶尔也会在我们从API中提取信息的区域中获取一条lambda错误消息,该信息表示数据变量是未定义的,这也会在信息达到第11天或第12天时发生,但在它仍然低于10.这也让我们认为我们正在超载我们正在使用的API。
根据我的理解,上面错误的有效负载是我们传递给event.variable中的lambda的。每当我们尝试运行30天的信息时,我们会在第11-12天左右收到此错误。在与RDS数据库建立连接后,会立即出现此错误消息。我基本上仍然是大多数这些东西的初学者所以我不确定这是否"未处理的有效载荷"是关于lambda或rds,虽然我倾向于认为它与RDS有关。我之前从未见过这个错误,在研究它时似乎是一个非常广泛的错误。
如果是RDS,可能是导致此错误的原因是什么?如何绕过它?只是我的数据库太弱而无法处理负载吗?疯狂的是,即使我在下一个lambda的调用之间设置了60秒的延迟,我仍然会收到此错误。但是当我在控制台内设置一个60秒的触发器并在30分钟后手动打开和关闭它时,它运行完美。我不理解我在我的代码中设置60秒延迟以调用lambda的新实例和通过控制台设置60秒触发器之间的区别,当他们两个都触发lambda的新实例时60秒为什么一个工作完美,另一个给我上面的错误信息,当唯一的区别是一个通过我的代码每60秒调用一次,另一个通过AWS Lambda控制台每60秒调用一次。
目标是通过API-Gateway中的http端点在表单提交网页时触发lambda,将一条信息从其中一个表单传输到lambda中。来自api-gateway的触发工作,并且lambda工作到一个点,所以如果我可以让端点启用60秒触发器,并在1800秒或30分钟后将其关闭,我知道100%事实它会功能完美。但它一直在困扰我,我无法理解为什么当调用lambda的方式基本上做同样的事情时它不起作用,而且我无法找到错误信息的原因。
答案 0 :(得分:0)
我很确定我已经发现了问题的原因,以及为什么60秒的延迟永远不会用于尝试递归循环AWS-lambda函数。从我最好的解释方法来看,当你以编程方式调用lambda时,默认情况下,它被设置为“同步模式”。假设您有2个AWS-Lambda函数。你从lambda 1调用lambda 2.在Lambda 2完成之前,Lambda 1不会认为自己已完成。如果lambda 2调用第3个lambda,它将启动一个注定要失败的链。最重要的是,如果一个被调用的lambda没有在2分钟标记处完成,它将尝试再次运行它,然后是2分钟后,第三次运行它。
所以我运行它的方式,基本上是引起连锁反应。它越往下走,链条越长,导致越来越多的lambda达到2分钟和4分钟的标记,导致同一天的条目在数据库中多次上传,充斥着与RDS的连接和我正在使用的API,并最终导致所有lambdas达到5分钟超时。
我们发现的解决方案是通过AWS API-Gateway通过http端点调用它。它调用lambda并继续前进。当我们尝试这个时,我们的倒计时工作,并在几分钟内完成了30天的信息。
另一方面,我知道有一种方法可以在“异步模式”下设置以编程方式调用的lambda。我从来没有使用它,我不确定它是否调用函数并继续运行,因为我最初认为我的原始想法正在做,或者如果它等同于同步模式那样,即它调用的lambda必须完成在它认为自己完成之前。