Я создал несколько API-интерфейсов, используя AWS Lambda и NodeJs (Микро-микросервисы? Нано-сервисы), и нашел этот процесс довольно приятным, особенно когда я обнаружил Serverless Framework, который избавляет от необходимости настраивать API-шлюз и автоматизирует процесс развертывания. (Копирование и вставка кода в консоль AWS - это не путь вперед, а CloudFormation немного пугает!)

Я думал, что увижу, насколько легко будет создать реальное веб-приложение (с пользовательским интерфейсом) на бессерверной основе. Вот как прошел этот процесс ...

Приложение

Вы можете увидеть конечный результат, посетив https://www.showmeadog.net/ (предупреждение о спойлере?). Я только что наткнулся на Dog API, а что может быть лучше в Интернете, чем просмотр фотографий животных?

В приложении есть две страницы: одна со списком всех имеющихся пород собак, а другая с фотографией выбранной породы. На странице списка будет ссылка на страницу с фотографиями.

Первые шаги

Я использовал Serverless Framework и AWS Lambda вместе с NodeJs. Вы, конечно, можете использовать Serverless с другими языками программирования и другими облачными провайдерами, но я лучше всего знаком с этими двумя.

Я предполагаю, что NodeJ и NPM уже установлены.

Первое, что нужно сделать, это установить Serverless:

npm install -g serverless

Тогда мы можем получить пустой проект, запустив:

serverless create --template aws-nodejs --path show-me-a-dog
cd show-me-a-dog

Это создаст serverless.yml файл конфигурации и handler.js, содержащий точку входа для Lambda.

Реквизиты для входа

На сайте Serverless есть инструкции по настройке учетных данных AWS.

На мой взгляд, одним из недостатков Serverless является то, что для него требуется довольно высокий уровень разрешений, и не так просто определить, какой именно набор необходим для конкретного приложения (это зависит от того, что именно делают ваши функции).

Самый простой способ продвинуться вперед - предоставить бессерверный «полный доступ» - неплохо создать для этого отдельного пользователя IAM.

Добавьте зависимости

У нас есть доступ к полному набору API-интерфейсов Node, но есть также много полезных библиотек на NPM, так что давайте настроимся на их использование:

npm init

Здесь вы можете оставить большинство значений по умолчанию. Теперь мы можем npm install все, что кажется полезным, например язык шаблонов Handlebars и реализацию Fetch API:

npm install --save handlebars
npm install --save isomorphic-unfetch

При развертывании приложения Serverless упакует все, включая ваш node_modules, и отправит все это в облако.

Автономное тестирование

Что-то, что может показаться немного неудобным в Lambda, - это невозможность тестировать ваши функции в автономном режиме. Вы, конечно, можете писать модульные тесты для своей функции-обработчика, но Serverless также имеет систему плагинов, и очень полезный пример - serverless-offline. Его можно установить через NPM и легко настроить в serverless.yml, добавив пару строк конфигурации:

plugins: 
  - serverless-offline

Теперь запуск serverless offline запустит сервер на порту 3000, который вы можете открыть в браузере (или через curl и т. Д.).

Теперь мы готовы добавить некоторые функции к этому пустому файлу обработчика…

Напишите код!

Начнем со страницы списка. Вы можете посмотреть полный исходный код на GitHub - я не буду здесь все воссоздавать.

Для начала нам понадобится небольшая конфигурация:

functions:  
  list:    
    handler: handler.list    
    events:      
      - http:          
        path: /          
        method: get

Это устанавливает соответствие между корневым URL-адресом Lambda и функцией с именем list в файле обработчика. Эта функция выглядит так:

Это довольно просто:

  • Получите данные из API
  • Вытащить список пород из ответа JSON
  • Вызов Handlebars с этими данными
  • Вернуть HTML

Вы можете увидеть полный исходный код handler.js на GitHub. Функция show очень похожа, но конфигурация немного отличается, позволяя передавать параметр:

path: /{breed}

Этот параметр доступен в обработчике путем вызова:

const breed = event.pathParameters.breed;

Укладка

С обеими встроенными функциями у нас есть функциональное, но не особенно привлекательное приложение.

Можно было бы разместить некоторый CSS на S3 и ссылаться на него, но это добавляет дополнительный шаг развертывания за пределами бессерверной среды. Для такого небольшого приложения я решил встроить CSS в вывод HTML.

Чтобы сделать вещи более управляемыми, я поместил CSS в отдельный файл, а затем использовал модуль uglifycss, чтобы минимизировать его перед отправкой в ​​Handlebars для размещения в документе HTML:

const css = uglifycss.processFiles(['style.css']);

Развертывание

Хорошо, теперь мы готовы развернуть наше приложение в облаке AWS. Это легко и приятно:

serverless deploy

Выполнено! Бессерверная версия выведет URL-адрес - скопируйте и вставьте его в браузер, и вы должны увидеть приложение.

В качестве дополнительного вознаграждения можно настроить CodeBuild и CodePipeline для автоматического создания всех новых коммитов.

Добавление персонализированного URL

URL-адрес по умолчанию, на котором размещены лямбда-выражения, не очень удобен для пользователей. К счастью, можно сопоставить функцию с настраиваемым адресом, выполнив следующие действия в консоли AWS:

  • Сначала зарегистрируйте новое доменное имя в AWS (или используйте уже имеющееся - их можно импортировать от других провайдеров).
  • Домен должен поддерживать HTTPS - AWS предоставляет ACM (что бесплатно!). Сертификат ACM должен быть создан в регионе us-east-1, независимо от того, в каком регионе размещена ваша функция. (Например, моя функция находится в регионе Канады, и она по-прежнему работает нормально)
  • Перейдите в консоль API Gateway для своей функции и выберите «Пользовательское доменное имя». Следуйте инструкциям здесь. Также не забудьте получить идентификатор распространения CloudFront для своей функции. Он понадобится вам на следующем шаге.
  • Создайте набор записей Route 53: вам понадобится ссылка типа «A» с ALIAS для распространения CloudFront из последнего шага.

Теперь у вас должна быть возможность получить доступ к своей Lambda через выбранный вами URL, и любой, кто не знает, не поймет, как она размещена!

Что дальше?

Мы увидели, насколько просто можно настроить размещение вашего приложения без серверов. Этот метод отлично подходит для небольших приложений, таких как пример здесь, но он может не масштабироваться.

К счастью, есть несколько проектов, которые пытаются обеспечить такой уровень простоты, но с большей гибкостью. Одним из примеров является Architect Framework, который звучит так, как будто он может быть идеальным!

Я планирую попробовать переписать это приложение с помощью Architect, чтобы увидеть, насколько хорошо оно работает. Будьте на связи…