Часть 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 через переменную CloudFormation Ref

Хотя мы определили имя нашего слоя только как момент, но, как вы видите, 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 имеет множество плагинов, и разные приложения могут иметь немного разную структуру. Дайте мне знать в разделе комментариев, если у вас есть какие-либо предложения или вопросы.