У меня есть следующее дерево проекта
Где папка nodejs — это лямбда-слой, определенный в следующем serverless.yaml
service: aws-nodejs # NOTE: update this with your service name
provider:
name: aws
runtime: nodejs8.10
stage: dev
plugins:
- serverless-offline
layers:
layer1:
path: nodejs # required, path to layer contents on disk
name: ${self:provider.stage}-layerName # optional, Deployed Lambda layer name
functions:
hello:
handler: handler.hello
layers:
- {Ref: Layer1LambdaLayer}
events:
- http:
path: /dev
method: get
Уровень 1 содержит только пакет UUID.
Поэтому, когда я пытаюсь запустить лямбду локально с помощью бессерверного автономного плагина, он говорит, что не может найти UUID модуля.
Но когда я развертываю код на AWS, он работает как часы.
Каким-либо образом мы можем запустить лямбда-слои локально для целей тестирования? а для ускорения разработки?
Или есть ли способ, где я могу динамически установить путь node_module так, чтобы он указывал на папку слоя во время разработки, и как только мне нужно перейти к производству, он изменит путь на правильный
Хорошо, после многих испытаний я нашел рабочее решение
Я добавил команду запуска npm, которая экспортирует временный путь node_module в список путей.
"scripts": {
"offline": "export NODE_PATH=\"${PWD}/nodejs/node_modules\" && serverless offline"
},
Таким образом, узел может искать модули узла внутри подпапок.
Хорошее решение. Но что делать, если у вас больше одного модуля?
@ yuriy.stos, вы имеете в виду, если у нас есть несколько слоев?
Кстати, эта проблема была исправлена в sls 1.49.0. Просто беги:
sudo npm i serverless
Затем вы должны указать package include в разделе слоя serverless.yml.
service: aws-nodejs # NOTE: update this with your service name
provider:
name: aws
runtime: nodejs8.10
stage: dev
plugins:
- serverless-offline
layers:
layer1:
path: nodejs # required, path to layer contents on disk
package:
include:
- node_modules/**
name: ${self:provider.stage}-layerName # optional, Deployed Lambda layer name
functions:
hello:
handler: handler.hello
layers:
- {Ref: Layer1LambdaLayer}
events:
- http:
path: /dev
method: get
Протестировано во время выполнения nodejs10.x
Решит ли это проблему поиска пакетов для бессерверного автономного плагина?
Протестировано. Не работает. Serverless по-прежнему не может найти путь /opt/something
, когда something
на самом деле не в /opt
(это, очевидно, плохая практика помещать ваш код под учетной записью root в /opt
Я обошел это, запустив serverless-offline в контейнере и скопировав свои слои в каталог /opt/ с помощью gulp. Я установил gulp watch, чтобы отслеживать любые изменения слоя и копировать их в каталог /opt/.
Я использую слои в автономном режиме без сервера, устанавливая слой из локальной файловой системы в качестве зависимости от разработчиков.
npm i <local_path_to_my_layer_package> --save-dev
как называется твоя тема? выглядит хорошо!