
Содержание статьи
от Марка Хопсона

В этом руководстве для начинающих мы кратко опишем «бессерверную» архитектуру программного обеспечения, а затем через несколько минут создадим RESTful API с помощью AWS, Node.js и Swagger.
Итак, что такое Serverless?
Термин «без сервера» (он же «функция как услуга») описывает тип архитектуры, позволяющий развертывать код и работать в эфемерных контейнерах без сохранения состояния от сторонних поставщиков (например, Azure или AWS).
Преимущества без сервера
- Снижен оперативный менеджмент. Бессерверные архитектуры позволяют разработчикам сосредоточиться на написании кода, а не беспокоиться о настройке и управлении инфраструктурой, на которой работает их код.
- Легкое, гибкое зум. Поскольку бессерверные функции (ваши бессерверные приложения) не имеют состояния и всегда вызываются событием (например, HTTP-запросом), вы можете запускать столько или меньше функций, сколько вам нужно. Больше вызовов означает больше контейнеров. В зависимости от масштаба и формы вашего трафика это может быть очень экономически эффективным, поскольку бессерверные функции обычно выставляются за вызов.
Бессерверные недостатки
- Задержка для исходных запросов (известная как «холодный запуск»). Если функция без сервера неактивна (не запускалось некоторое время), обработка первого вызова может потребовать дополнительного времени, поскольку контейнеру придется инициализировать (т.е. выделить хост, загрузить код и т.п.).
- Отсутствие системного контроля. Поскольку ваш код работает в среде, управляемой поставщиком, вы не сможете контролировать обновление системы или зависимости за пределами вашей базы кода.
Что такое CloudFormation?
CloudFormation – это сервис от Amazon, позволяющий создавать ресурсы AWS с помощью шаблонов. Шаблон – это файл конфигурации (YML или JSON) для предоставления всех ваших ресурсов AWS, таких как экземпляры EC2, таблицы DynamoDB, роли и разрешения IAM или что-либо другое.
Начинаем кодировать!
В этом руководстве мы собираемся создать простой RESTful API с двумя конечными точками:
POST /users/${userId}/hello
Тело запроса будет сохранено в таблице DynamoDB. В данном руководстве тело запроса должно иметь следующую структуру: { "email": "any@email.com" }
ПОЛУЧИТЕ /users/${userId}/hello
Ответ будет содержать значение для "email"
установить в запросе POST.

Шаг 1: Клонируйте репо
Для этого учебника вам понадобятся два файла: index.js
(код NodeJS для нашей функции Lambda) и stack.yml
(шаблон стека CloudFormation). Чтобы получить эти файлы, перейдите по этой ссылке Github.
Шаг 2. Просмотрите файл stack.yml
Обратите внимание на stack.yml
в хранилище, поскольку это конфигурационный файл, который будет использоваться CloudFormation для создания всего, что потребуется нашей программе.
Ниже приведена подробная схема всех наших ресурсов AWS stack.yml
нужно будет создать. Имена, используемые в YML, находятся в красных квадратах.

Шаг 3: Загрузите шаблон CloudFormation
Просмотрев YML, перейдите по этой ссылке и нажмите Создать стек кнопку. Выберите Загрузите шаблон на Amazon S3 и загрузите stack.yml
файл.

На следующем экране вас попросят выбрать Название стека (может быть что угодно). Затем нажмите Далее и выберите Я признаю, что AWS CloudFormation может создавать ресурсы IAMи снова нажмите кнопку Далее.
На этом этапе создается ваш стек. Подождите минуту на странице «Стеки», пока статус вашего стека не станет CREATE_COMPLETE.

Шаг 4. Найдите свой Lambda, созданный CloudFormation
Когда ваш стек будет заполнен, перейдите и найдите здесь новую Lambda вашего стека. Название вашей функции Lambda должно походить на ${StackName}-HelloLambda-XXXX.

Шаг 5. Разверните (скопируйте и вставьте) свой код на Lambda
Найдите лямбду, щелкните ее, чтобы получить более подробную информацию. Затем перейдите к Код функции раздел, изменить Тип ввода кода к Встроенное редактирование кодазатем откройте и скопируйте index.js
(с репо) в редактор кода. Нажмите сохранить.

На данный момент ваш код развернут на Lambda, и все, что осталось, это развернуть наш API Gateway, чтобы мы могли посылать ему HTTP-запросы.
Шаг 6. Найдите свой шлюз API, созданный CloudFormation
Найдите здесь свой шлюз API, созданный с помощью шаблона CloudFormation. Название вашего шлюза API должно походить на ${StackName}-MyApiGateway.

Шаг 7. Убедитесь, что ваш API Gateway подключен к Lambda
Когда вы найдете свой шлюз API, мы можем проверить, все ли подключено, выбрав ПОСТ вариант под /пользователей а затем щелкните ТЕСТ.

На странице Test установите идентификатор пользователя до 123 и установите Тело запроса к следующему и нажмите Тест. Если все работало, то Статус должно быть 200 без данных.

После тестирования конечной точки POST вы можете проверить, сохранены ли ваши данные, перейдя на страницу /hello GET Test и попробовав запрос (не забудьте установить идентификатор пользователя к 123). Тело ответа должно содержать тело запроса из теста POST (см. выше).
Теперь, когда вы убедились, что ваш шлюз API, Lambda и DynamoDB подключен, вы можете развернуть свой шлюз API, чтобы получить доступ к нему из Интернета.
Шаг 8. Разверните шлюз API
Чтобы развернуть API, нажмите меню «Действия» и выберите «Развернуть API». Когда появится всплывающее окно подтверждения, установите Стадия развертывания к прод а затем нажмите Развернуть.

После того, как вы развернете свой API, вас будет перенаправлено в Этапы страница для прод. Здесь вы найдете домен для своего шлюза API в выделенной синей области рядом Вызвать URL.

Используя URL со снимка экрана выше, я могу отправить a ПОЛУЧИТЕ /users/123/hello запрос в браузере, как показано ниже.

И все это! Теперь у вас есть бессерверный RESTful API, который является масштабируемым, надежным, не требует исправления или инициализации и не стоит денег во время простоя. Надеюсь, вам понравился этот учебник. Если у вас есть отзывы, оставьте их в комментариях ниже. Спасибо!
Другие примечания и сноски
- Конфигурация маршрута для шлюза API встроена в конфигурацию шлюза API (MyApiGateway) внутри
stack.yml
что делает YML еще большим уродом, чем она есть. - Сменные среды на странице конфигурации HelloLambda Lambda содержат информацию, необходимую для подключения к таблице HelloTable DynamoDB.
- AWS-SDK поставляется в комплекте с каждой функцией Lambda, поэтому мы можем ее использовать
require('aws-sdk')
без apackage.json
. Очень удобно! - Вместо того чтобы копировать и вставлять код NodeJS во встроенный редактор на странице Lambda Details, вы можете развернуть свой код через AWS CLI. Мы копируем и вставляем для упрощения.
- Соблюдайте осторожность, шаблон стека CloudFormation чрезвычайно многословен по своей природе. Я обещаю, что это не только я и моя
stack.yml
. - Основным ключом раздела таблицы HelloTable DynamoDB является идентификатор пользователя
- от тебя/SalamiJack: «Стоит отметить, что производительность API Gateway+Lambda, даже для разогретого простого Lambda, довольно плоха. Ожидайте, что время ответа будет 80-150 мс».
Впервые опубликовано medium.com 26 марта 2018 года.