Невозможно вызвать рекурсивную функцию с помощью AWS Lambda. - PullRequest
0 голосов
/ 26 января 2019

Я не могу вызвать лямбда-функцию рекурсивно. Мои функции находятся в одном и том же 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, которые я считаю общими, так как я могу вызвать функцию один раз?

...