В ожидании лямбда-инициализации - PullRequest
0 голосов
/ 16 января 2020

У меня есть некоторая инициализация, которую я хотел бы сделать за пределами моего метода обработки лямбда-событий, в основном просто загрузка переменных среды, но некоторые из них зашифрованы с помощью KMS, поэтому мне нужно расшифровать их, но мне нужно подождать, пока Promise разрешить. Javascript не является моим основным языком, поэтому я не уверен в разумном способе (если есть) в достижении этого.

Моя текущая реализация выглядит так

const controller = parseEnv(process.env).then((parsedEnv) => {
    return new InstallController(parsedEnv);
});

exports.handler = async (event, context, callback) => {
    const install = await controller;
    return install.handle(event, context, callback);
};

в идеале Я хотел бы переместить const install = await controller; за пределы функции exports.handler. Могу ли я сделать это без использования жесткого сна?

1 Ответ

1 голос
/ 16 января 2020

Лямбда была разработана для serverless архитектуры, это означает, что лямбда-функция может go переводить в "спящий" режим, если она не вызывается.

Затем, если вы вызываете вашу лямбда-функцию последовательно, переменные вне обработчика были кэшированы.

Я покажу вам, как я нахожусь:

const initInstall = async () => {
  const parsedEnv = await parseEnv(process.env);
  return new InstallController(parsedEnv);
};

let install = null;

exports.handler = async (event, context, callback) => {
  if (!install) {
    install = await initInstall();
  } else {
    // Hit from "cache"
  }
  return install.handle(event, context, callback);
};

Я рефакторинг const controller в initInstall функция, это асин c функция.

И создайте переменную, которая называется install для «кэширования» InstallController объекта.

В функции handler просто проверьте, существует ли install или нет, если нет, назначьте результат от initInstall до install.

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