AWS Lambda:通过其他Lambda函数调用函数

3
我有一个AWS Lambda函数,需要约30秒才能完成。当我将它连接到API网关时,由于5秒的超时,会发送504错误。因此,我的easyCron工作失败了,并且不会再尝试(我只有一个免费计划)。
所以我需要一个API,发送正确的200状态。
我的想法是:
通过短期Lambda调用长期Lambda。策略允许调用。
以下是代码:

var AWS = require('aws-sdk'),

 params = {
  FunctionName: 'cctv',
  InvocationType: 'RequestResponse',
  LogType: 'Tail'
 },
 lambda;
AWS.config.update({region: 'us-east-1'});
lambda = new AWS.Lambda();

exports.handler = function (event, context) {
 'use strict';
 lambda.invoke(params, function (err, data) {
  if (err) {
   console.log(err, err.stack);
  }
  else {
   console.log(data);
  }
 });
 context.succeed('hey cron job, I think my lambda function is not called');

};

但我认为,context.succeed() 会终止 lambda.invoke() 的执行。

您有任何解决方法吗?


你实际上并没有调用调用Lambda函数的代码。你正在定义一个函数来执行工作到exports.handler,但这并没有被调用。 - Matt Houser
这段代码由API网关调用。它打印了成功消息,但没有调用第二个Lambda函数“cctv”。 - Christian Haller
是的,因为你上面列出的代码实际上并没有调用 lambda.invoke。所以你的一级函数被调用了,但是你的一级函数实际上并没有调用你的二级函数。 - Matt Houser
我已经将API Gateway与第一个Lamba函数连接起来,现在它正在调用处理程序handler()。我认为大致上是这个代码:require('./index').handler({},{succeed:function(message){ console.log(message); },'error':function(){}});因此,我猜应该调用lambda.invoke() - Christian Haller
你能展示完整的一级源代码吗? - Matt Houser
AWS.Lambda.invoke 的本质是异步的。在 lambda.invoke 回调函数中调用 context.success - Ricardo Nolde
2个回答

6

谢谢!使用InvocationType: 'Event',我得到了一个202! :) - Christian Haller

0
与其直接调用超过30秒的Lambda函数,你可以从SNS或S3 PutObject事件中触发它。这样做将使其与API Gateway路由异步进行,因此可以非常快速地返回。当然,在那个时候你将无法得知Lambda作业的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接