Javascript 将AWS Lambda与计划事件一起使用时,递归Lambda函数停止

Javascript 将AWS Lambda与计划事件一起使用时,递归Lambda函数停止,javascript,node.js,recursion,aws-lambda,Javascript,Node.js,Recursion,Aws Lambda,我的递归lambda函数在使用计划的AWS事件(也与cron作业选项一起使用)调用时停止。如果我使用lambda dashboad或无服务器框架进行调用,一切都可以。lambda函数的持续时间超过6小时,当通过事件调用时,它会运行15-30分钟,然后停止。调用lambda函数的方式是否有区别?我在哪里可以找到这种行为的解释 LAMBDA-METHOD -> invokeLambda(lambdaname, payload) { // eslint-disable-line class-me

我的递归lambda函数在使用计划的AWS事件(也与cron作业选项一起使用)调用时停止。如果我使用lambda dashboad或无服务器框架进行调用,一切都可以。lambda函数的持续时间超过6小时,当通过事件调用时,它会运行15-30分钟,然后停止。调用lambda函数的方式是否有区别?我在哪里可以找到这种行为的解释

LAMBDA-METHOD -> invokeLambda(lambdaname, payload) { // eslint-disable-line class-methods-use-this
    const req = {
      FunctionName: lambdaname,
      InvocationType: 'Event',
      Payload: JSON.stringify(payload),
    };

    const lambda = new aws.Lambda({
      region: 'us-east-1',
    });

    console.log(`[INFO - LAMBDA - ${lambdaname.toUpperCase()}] ${JSON.stringify(payload)}`);
    return lambda.invoke(req).promise();
  }
...
const createInstance = (Gapi, Parser, Lambda, Config) => {
  const gapi = new Gapi(Config);
  const parser = new Parser(gapi, Config);
  return new Lambda(gapi, parser, Config);
};
...
exports.sync_contacts = async (event, context) => {
    // create clear instance of class
    const Lambda = createInstance(GAPI, PARSER, LAMBDA, CONFIG); 
    // util for handle 5min limit lambda :use context.getRemainingTimeInMillis()
    const middleware = Ware(); 
    // return result off work after 5 min (worked 4.5 min then give 0.5 for refresh)
    const nextRefresh = await refresh(Lambda, middleware)(event, context);
    if (typeof nextRefresh === 'string') return nextRefresh;
    // recursive invoked
    if (nextRefresh.type === 'REFRESH') {
        return Lambda.invokeLambda(
            context.functionName,
            nextRefresh,
        );
    }
    // recursive invoked
    if (nextRefresh.type === 'DONE') {
        Lambda.token = nextRefresh.token;
        const [err, token] = await Lambda.tokenStep('NEXT');
        if (err) return err;
        if (token) {
            return Lambda.invokeLambda(
                context.functionName,
                { type: 'INIT', payload: { lastIndex: 0, token } },
            );
        }
    }
    // finish
    return '[LAMBDA - GLOBAL - DONE]';
};

问题在于
memorySize
参数的设置。当我第一次运行脚本时,数据很小,默认的128MB足以完成任务。在下一次启动时,数据量很大,这就是为什么我必须增加到512MB。鉴于我使用递归lambda函数的经验,我希望有人能对我有所帮助。

我没有收到您的代码,因为您没有直接使用,但确实有:一个是干运行(不需要什么),另外两个在同步(
RequestResponse
)或异步(
事件
)方面有所不同。我不知道这是否可以解决您的问题,但您可以尝试一下,谁知道…顺便说一下,上限是5分钟(而不是代码中提到的3分钟)。有一个名为context的方法,它可以给你剩余的时间来更好地处理死线。我更正了代码中的注释。你检查了CloudWatch中的日志了吗?如果是,您能在这里提供它,以便我们可以与您一起调试它吗?递归函数的问题是,任何故障都会停止整个执行,可能是内存不足(非常常见)、执行时间过长、IAM角色没有所需权限等。默认情况下,也可以调用回调函数(或像您一样在异步函数中使用
return
)如果承诺仍处于挂起状态,则不得停止Lambda执行。您可以通过设置
context.callbackaitsforeptyeventloop=false
,,来更改此行为。