Как использовать общий код в лямбдах в шаблоне AWS SAM, используя слои в Node.js? - PullRequest
1 голос
/ 07 марта 2020

У нас очень простой вариант использования - мы хотим поделиться кодом со всеми нашими лямбдами, и мы не хотим использовать веб-пакет.

Мы не можем поместить относительные пути в наши package.json файлы в лямбда-папках, потому что когда вы делаете sam build дважды, он УДАЛЯЕТ общий код, и я понятия не имею, почему.

Ответьте требования:

  • Уметь локально отлаживать
  • Уметь запускать модульные тесты в бизнес-логике c (без необходимости запуска в песочнице AWS)
  • Уметь запускать тесты в sam local start-api
  • Возможность отладки кода в контейнере с помощью sam local invoke
  • sam build работает
  • sam deploy работает
  • Работает в AWS Лямбда в облаке

1 Ответ

1 голос
/ 07 марта 2020

TL; DR

  • Поместите свой общий код в слой
  • При ссылке на общий код в лямбда-слое используйте троичный оператор, когда вам требуется (). Проверьте переменную среды, которая устанавливается только при работе в среде AWS. В этом случае мы добавили короткую переменную AWS в шаблон SAM, но вы можете найти переменные среды, которые автоматически определяет AWS, но они не будут такими короткими. Это позволяет выполнять локальную отладку за пределами стека AWS, что позволяет проводить очень быстрые модульные тесты, которые проверяют бизнес-логи c.
let math = require(process.env.AWS ? '/opt/nodejs/common' : '../../layers/layer1/nodejs/common');
let tuc = require(process.env.AWS ? 'temp-units-conv' : '../../layers/layer1/nodejs/node_modules/temp-units-conv');
  • Вам не нужно использовать троичный оператор, как этот, если только внутри лямбда-папки код

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

https://github.com/blmille1/aws-sam-layers-template.git


Gotchas

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

Очень заманчиво добавить ссылку на папку в пакет функции lambda. json .

//...
"dependencies": {
    "common":"file:../../layers/layer1/nodejs/common"
},
//...

Если вы сделаете это, будет работать первый sam build. Однако при втором запуске sam build ваша папка общего кода и все подкаталоги будут DELETED . Это связано с тем, что при сборке sam создается папка. aws -sam. Если эта папка существует, она выполняет очистку npm, и я думаю, именно это провоцирует удаление общего кода.

...