Невозможно вызвать рекурсивную функцию с помощью AWS Lambda.

Я не могу вызвать лямбда-функцию рекурсивно. Мои функции находятся в одном и том же VPC, они могут взаимодействовать с моими ресурсами RDS. Они также могут использовать общедоступные ресурсы благодаря шлюзу NAT. Я могу успешно вызвать функцию один раз из моего диспетчера задач (см. Ниже). Историческая функция должна выполняться рекурсивно до тех пор, пока критерии не будут выполнены, она вызывает себя, но ничего не происходит.

Я работаю над проектом, в котором есть диспетчер задач, который работает на cron как лямбда-функция. В настоящее время функция ищет в базе данных MySQL, размещенной через RDS, любые задачи, которые еще не запущены или не выполнены. Затем он компилирует необходимые параметры и вызывает другую лямбда-функцию для фактического выполнения подъема.

Код задачи:

module.exports.tasks = async (event, context) => {
let tasks = await getTasks();

  let tasksStarted = 0;

  for (const task of tasks) {
    let attr1 = await redacted;
    let attr2 = await redacted;

    let body = {
      task: task,
      account: attr1,
      pair: attr2
    };

    const params = {
      FunctionName: "redcated-historical",
      InvocationType: "Event",
      Payload: JSON.stringify(body)
    };
    tasksStarted += 1;
    console.log("LAMBDA Invoke");
    lambda.invoke(params, context.done);
    console.log("Updating DB");
    let update = await updateTask(task.id, {
      start_date: new Date()
    });
    console.log("Updated")
  }
  console.log("Finished Starting Tasks");

  await mysql.end();

  // Return the results
  return {
    tasksStarted: tasksStarted
  };
};

Рекурсивный код (этот код не работает):

module.exports.historicalTask = async (event, context) => {
  console.log("STARTING HISTORICAL TASK");

  api.configure({
    apiKey: event.account.api_token,
    accountId: event.account.account_id
  });

  console.log("Getting objects from API");

  const {objects, params} = await api.call(event.task)

  let lastTimeStamp = objects[objects.length - 1].time;
  let promises = [];
  console.log("Starting Save");
  for (let object of objects) {
    let history = new Historical();
    history.timestamp = new Date(object.time);
    //redacted info
    promises.push(history.insert(mysql));
  }
  console.log("WAITING FOR SAVE");
  const result = await Promise.all(promises);
  console.log("SAVED");
  let newDate = moment(lastTimeStamp);
  let endDate = moment(event.task['search_end_date']);

  newDate.add(5, 'm');

  if (newDate.isAfter(endDate)) {
    await updateTask(event.task.id, {
      completed: 1,
      completed_date: new Date()
    });
    await mysql.end();
    context.done('Finished');
  } else {
    event.task.search_start_date = newDate.toDate();
    const params = {
      FunctionName: "redacted-historical",
      InvocationType: "Event",
      Payload: JSON.stringify(event)
    };
    await updateTask()
    console.log("Invoking again!");
    lambda.invoke(params, context.done);
  }
};

Мой ожидаемый результат состоит в том, что отредактированная историческая функция продолжит вызывать себя, пока критерии (включенные) не будут выполнены. Я что-то пропустил? Я видел множество статей и примеров с рекурсивными лямбда-функциями.

Я предполагаю, что это не мои роли или VPC, которые я видел как общие проблемы, так как я могу вызвать функцию один раз?

0 ответов

Другие вопросы по тегам