AWS Cognito лямбда срабатывает дважды - PullRequest
0 голосов
/ 18 января 2019

Я использую функцию AWS Lambda (используя nodejs).

Один раз любой запрос от APP к Cognito для регистрации пользователей. Затем я установил Триггер предварительной регистрации , чтобы проверить клиента пользователя и проверить пользовательский атрибут пользователя, доступный в нашей базе данных или нет. Если да, верните ошибку, а затем вставьте новые записи в БД и верните событие в Cognito.

TimeoutInfo - 5 мин.

Это происходит когда-то в запросе, а не все время. RequestId как другой. (иногда срабатывает 3 раза, чаще всего дважды)

Лямбда-код запуска, как показано ниже.

Пользователи / index.js

const handler = async (event, context) => {
  log.info('createUserLambda:start');
  // immediately return once the call back is called to avoid
  // lambda time out because of any open db connections
  context.callbackWaitsForEmptyEventLoop = false;
  return await preUserCreate(event);
};

exports.handler = обработчик; users / users.js

export const preUserCreate = async (event) => {
  log.info('preUserCreate:Start');
  let userAttributes = event.request.userAttributes;
  const currentDate = moment().utc().format('YYYY-MM-DD HH:mm:ss');
  try {
    let userParams = {
      'docStatus': 'VRF'
    };
    let docParams = [{
      'docNumber': userAttributes['custom:document_number'] ? userAttributes['custom:document_number'] : '',
      'createdDate': currentDate
    }];
    if (docParams.length && docParams[0].docNumber) {
      let documentExit = await getDocs(docParams[0].docNumber);
      if (documentExit.length) {
        log.info('preUserCreate:Error');
        throw new Error('Document number already exist.');;
      }
    }

    let documentRs = await insertDocument(docParams);
    userParams = {
      'did': documentRs[0].id,
      'id': event.userName,
      'createdDate': currentDate,
      'updatedDate': currentDate,
      ...userParams
    };
    let userRs = await insertUser([userParams]);
    if (docParams.length && docParams[0].docNumber) {
      let resultData = await getUserAccountFromAPI(docParams[0].docNumber);
      if (resultData) {
        let foramattedData = await formattedAccountsData(resultData, userRs[0].id, documentRs[0].id);
        await insertUserAccounts(foramattedData);
      }
    }
    log.info('preUserCreate:Success');
    event.response = {
      'autoConfirmUser': false,
      'autoVerifyPhone': false,
      'autoVerifyEmail': false
    };
    return event;
  } catch (error) {
    log.info('preUserCreate:Error', error);
    throw (error);
  }
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Это, вероятно, происходит из-за установленного Cognito тайм-аута 5 секунд для интеграции Lambdas - и его нельзя изменить.Также обратите внимание, что максимальное количество попыток (повторного) вызова Cognito для вызова функции составляет 3 раза.

В разделе Настройка рабочих процессов пула пользователей с помощью лямбда-триггеров указано, что:

Важно Amazon Cognito синхронно вызывает функции Lambda.При вызове ваша лямбда-функция должна ответить в течение 5 секунд.Если это не так, Amazon Cognito повторяет вызов.После 3 неудачных попыток функция отключается.Это 5-секундное значение тайм-аута не может быть изменено.

Поэтому, чтобы сократить время выполнения, стоило бы рассмотреть возможность введения кэширования, где это возможно.Включая соединения с базой данных и т. Д.

Однако учтите, что у вас практически нет контроля над тем, как часто Lambdas используются повторно по сравнению с повторным запуском, и вам необходимо помнить об этом с точки зрения времени прогрева.

0 голосов
/ 21 января 2019

Есть ли шанс, что вы запускаете свою лямбду в VPC? Я видел похожее поведение с триггером Cognito, который запускался в VPC, когда был холодный запуск. Как только лямбда стала теплой, проблема ушла

Я догадывался, что внутренне Cognito имеет очень короткий период ожидания для выполнения триггера, и если триггер не отвечает вовремя, он автоматически повторяет попытку.

В итоге нам пришлось добавить логику в наш триггер, чтобы протестировать этот сценарий, чтобы мы не дублировали записи в нашу базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...