Часть 2 - Создание слоев лямбда с бессерверной структурой и поддержкой автономного режима
В этой части мы будем использовать Lambda Layers вместе с популярной Serverless Framework. Serverless Framework - хороший вариант для написания бессерверных приложений производственного уровня для нескольких облачных провайдеров. Вы можете довольно хорошо управлять своим кодом и легко управлять циклом развертывания.
В приведенном выше репозитории есть полностью работающее приложение с бессерверной структурой и лямбда-слоями.
Давайте начнем.
Создать бессерверное приложение
Мы будем использовать простое приложение hello-world вместе с moment
в качестве нашего слоя.
$ sls create --template aws-nodejs --path serverlesslayers
Начать с нашего handler.js
файла очень просто, и мы не добавляем никакой части нового кода, пока не закончим настройку слоя.
Создать слой
Мы добавим параллельный каталог layers
для создания слоя библиотеки моментов, и вместе он будет выглядеть примерно так.
В каталоге layers
создайте новый исходный каталог для текущего слоя. Библиотека moment-layer
довольно проста. У него есть только один package.json
файл с momentjs
зависимостью.
$ npm install --save moment
Теперь у нас есть наш Moment Layer, настроенный для интеграции с бессерверным приложением.
Интегрируйте уровень с бессерверным приложением
Теперь, когда у нас есть приложение и уровень, мы можем объединить их вместе с помощью файла конфигурации serverless.yml
.
Мы добавили здесь 3 разные конфигурации.
- NODE_PATH для поиска библиотек в папке
/opt/node_modules
. Лямбда-слой по умолчанию копирует зависимости в папку/opt
во время выполнения. Итак, мы добавляем это, чтобы получить наши слои. layers
раздел с относительным путем нашего кода слоя и совместимой средой выполнения,nodejs8.10
в нашем случае- Ссылка на наш слой в разделе
functions
через переменную CloudFormationRef
Хотя мы определили имя нашего слоя только как момент, но, как вы видите, Serverless Framework ожидает такое отформатированное имя для переменной Ref.
{Название слоя заглавными буквами} LambdaLayer
Теперь, когда у нас есть интегрированный уровень, давайте изменим наш код, чтобы использовать Moment в качестве зависимости.
Пришло время развернуть сервис на AWS и протестировать.
Развертывание
Развернуть бессерверное приложение в AWS довольно просто. Я предполагаю, что у вас уже есть набор команд serverless
на вашем компьютере.
Я использую эту команду для всех своих развертываний.
$ sls deploy --aws-profile {profile} --region {region} --stage {stage}
После запуска развертывания вы должны увидеть этот вывод на консоли.
Вы можете использовать URL-адрес GET в своем браузере и протестировать. Если все настроено правильно, вы должны увидеть это как результат.
{ "message": "Today is Sat" }
Локальное тестирование с помощью плагина serverless-offline
До сих пор мы разработали и протестировали нашу бессерверную функцию вместе с Lambda Layer непосредственно в среде AWS, но мы не будем развертывать на AWS каждый раз, когда вносим какие-либо изменения, а вместо этого хотели бы использовать плагин serverless-offline
для локального тестирования.
Следуйте этому руководству, чтобы добавить возможность безсерверного автономного режима в свое приложение.
После интеграции автономного плагина при локальном запуске приложения с sls offline
он выдаст ошибку Missing Module
.
Это связано с тем, что мы интегрировали библиотеку Moment через зависимость Layer, и она недоступна локально в пути поиска node_modules.
Чтобы обойти это, мы будем использовать настройки по умолчанию для Serverless Framework. По умолчанию Serverless Framework игнорирует dev-dependencies
при упаковке / развертывании функций в среде AWS. Итак, мы установим библиотеку моментов в наш основной сервис с зависимостью от разработчика.
$ cd serverlesslayers $ npm install --save-dev moment
Теперь, когда вы запустите приложение локально с sls offline
, оно найдет библиотеку моментов, и вы получите результат без каких-либо ошибок.
Однако, когда вы упаковываете или развертываете функцию сейчас с sls deploy
, ответ шлюза API не будет выполнен. Это связано с тем, что Serverless Framework по умолчанию исключает библиотеку moment
, даже если она является частью пакета слоев.
Чтобы исправить это, мы можем использовать явную директиву include в разделе пакета слоя.
При этом пакет слоев всегда будет включать node_modules
, прикрепленный к самому себе, но библиотека momentjs
, которую мы установили внутри службы, будет проигнорирована при окончательном развертывании.
Теперь вы можете тестировать свое приложение как в автономном режиме, так и на AWS, не требуя ручной настройки.
Serverless Framework имеет множество плагинов, и разные приложения могут иметь немного разную структуру. Дайте мне знать в разделе комментариев, если у вас есть какие-либо предложения или вопросы.