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, и я думаю, именно это провоцирует удаление общего кода.