ResourceConflictException, функция не может быть обновлена - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть лямбда-авторизация, в которой мне нужно обновить переменную среды, которая будет использоваться для входа пользователя в систему. Однако, когда я пытаюсь запустить свои тесты на селен для параллельного моделирования 16 пользователей, я получаю ResourceConfilitException, The function could not be update error.

function getSalt(functionName) {
  return new Promise((resolve, reject) => {
    if (process.env[saltKey]) {
      return resolve(process.env[saltKey]);
    }

    const salt = crypto.randomBytes(16).toString('hex');
    const lambda = new AWS.Lambda();

    let newFunctionName = functionName;

    return lambda.getFunctionConfiguration({ FunctionName: newFunctionName }, (getSaltError, data) => {
      if (getSaltError) {
        const getFunctionConfigError = new Error('Error getting function configuration');
        console.error(getFunctionConfigError);
        console.error(getSaltError);
        return reject(getSaltError);
      }

      const environmentVariables = data.Environment.Variables || {};
      environmentVariables[saltKey] = salt;

      const params = {
        FunctionName: data.FunctionName,
        Environment: {
          Variables: environmentVariables,
        },
      };

      return lambda.updateFunctionConfiguration(params, (updateError) => {
        if (updateError) {
          const saltError = new Error('Faild to update environment variables with new salt.');

          console.error(saltError);
          console.error(updateError);

          return reject(updateError);
        }

        return resolve(salt);
      });
    });
  });
}

Эта ошибка не возникает, когда я пытаюсь смоделировать асинхронные вызовы этой лямбды с помощью вызова await Promise.all(Array(n).fill().map(() => httpsCallAuthorizerLambda())). поэтому я не мог воспроизвести проблему.

1 Ответ

0 голосов
/ 26 ноября 2019

После еще нескольких исследований мне наконец удалось воспроизвести проблему. Проблема возникает из-за того, что более чем одна лямбда-функция пыталась установить environment variables одновременно во время выполнения, что вызвало ResourceConflictException. Я решил проблему, удалив updateFunctionConfiguration для установки переменных env во время run time и изменил ее, чтобы установить env variable deploy time, поскольку это было одноразовое задание.

aws lambda get-function --function-name $saltLambda > /dev/null 2>&1
if [ 0 -eq $? ]; then
  echo "Lambda '$saltLambda' exists"
  sipSalt=$(aws lambda get-function-configuration --function-name $saltLambda |jq -r '.Environment.Variables.SALT')
else
  echo "Lambda '$saltLambda' does not exist"
fi

if [ -n "$sipSalt" ]; then
  sipSalt=$(openssl rand -hex 16)
fi
npx sls deploy --sipSalt $sipSalt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...