Как у вас работает лямбда?Если через sam cli , что-то похожее на приведенное ниже работает для меня как мой template.yaml
...
пример шаблона
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: example of node.js lambda function using layer for dependencies
Resources:
ExampleFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: nodejs8.10
CodeUri: nodejs/
Handler: src/event.handler
Layers:
- !Ref NodeModulesLayer
NodeModulesLayer:
Type: AWS::Serverless::LayerVersion
Properties:
Description: full set of function dependencies
ContentUri: ./
CompatibleRuntimes:
- nodejs6.10
- nodejs8.10
LicenseInfo: 'Available under the MIT-0 license.'
RetentionPolicy: Retain
, указывающий на локальный слой
Руководство разработчика SAM содержит страницу Работа со слоями .В то время, когда я пишу это, они на самом деле не разбираются в том, как ссылаться на слои по локальным путям к файлам, а вместо этого сосредотачиваются на ссылках на удаленно размещенные слои.
Аспект, который я нашел хитрым, заключается в том, что каталогОжидается, что структура слоя node.js будет ...
nodejs/
node_modules/
..., что означает, что для того, чтобы локально установленный каталог node_modules
работал как слой, ваш файл package.json
должен быть вложен в папку с именем nodejs
.
Обратите внимание на пути в приведенном выше примере template.yaml
:
ExampleFunction.Properties.CodeUri
имеет значение nodejs/
ExampleFunction.Properties.Handler
должен быть указан как путь к файлу вашего обработчика, относительно nodejs/
. NodeModulesLayer.Properties.ContentUri
установлен как папка, содержащая как файл template.yaml
, так и nodejs
dir.
Это означает, что в моем примере предполагается следующая структура ...
nodejs/
node_modules/
src/
event.js
package.json
template.yaml
сохранить поддержку сборки sam
Еще один недочёт, который нужно опасаться ...
Что касается определения ресурса вашей функции в template.yaml
, то есть некоторая "гибкость"литий "с точки зрения того, какие части пути вы положили в CodeUri
против Handler
.В некоторых случаях выполнение ...
Properties:
CodeUri: nodejs/src/
Handler: event.handler
... работает так же хорошо, как выполнение ...
Properties:
CodeUri: nodejs/
Handler: src/event.handler
НО, если вы используете команду sam build
Бывший НЕ будет работать.Эта команда ожидает найти package.json
внутри каталога CodeUri
.Поэтому придерживайтесь CodeUri: nodejs/
и используйте значение Handler
для навигации по любой дополнительной иерархии папок, необходимой для достижения вашего обработчика.