Статьи

Создание бессерверных микросервисов с Node.js и AWS Lambda

Создание бессерверных микросервисов с Node.js и AWS Lambda было рецензировано Камило Рейесом , Джоан Инь , Яфи Берхану и Морицем Крегером . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Создание бессерверных микросервисов с Node.js и AWS Lambda

Если вы когда-нибудь хотели написать веб-приложение или API без возни с сервером, то вам может подойти Lambda от Amazon . AWS — это набор инструментов для разработчиков, который Amazon разрабатывает и предлагает публично.

В этой статье мы начнем работу с Lambda, новым инструментом в наборе Amazon Web Services (AWS). Мы будем использовать Lambda для создания конечной точки HTTP GET, которая будет выполнять запросы с использованием API GitHub для получения информации о репозитории из GitHub и возврата ответа JSON.

Чтобы следовать этой статье, вам понадобится собственный аккаунт AWS. Вы можете создать бесплатную учетную запись AWS по адресу https://aws.amazon.com/.

Что такое AWS Lambda?

Лямбда-тэг звучит так: «Запустите код, не думая о серверах». На первый взгляд это может показаться странным. Где или как на самом деле выполняется код?

Бессерверный и функции как сервис

«Без сервера» — это новый термин, обозначающий инфраструктуру программного обеспечения, который вы, возможно, слышали. Он используется для описания решений для выполнения кода по требованию. Термин «безсерверный» может вводить в заблуждение, поскольку на самом деле в этом уравнении все еще присутствуют серверы. Лучшим дескриптором является FaaS, или «Функции как сервис».

Оба определения используются для описания нового опыта разработки и развертывания. Этот новый опыт считается «безсерверным», поскольку вам, как разработчику, больше не нужно управлять, отслеживать или масштабировать серверы, на которых выполняется ваш код. Вы просто загружаете свой код в FaaS-провайдер (в данном случае — в AWS Lambda), а провайдер FaaS выполняет его и управляет любой инфраструктурой для вас за кулисами.

Плюсы и минусы безсерверной архитектуры

Учитывая это расширенное определение «безсерверной» архитектуры, давайте рассмотрим некоторые плюсы и минусы при работе с Lambda.

Pros

  • Оценка использования по требованию.

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

    Лямбда использует ценообразование по требованию, где биллинг рассчитывается для каждого использования функции. Это означает, что если ваш проект использует функции Lambda, которые не используются в большом спросе, вы можете сэкономить значительную сумму денег по сравнению с традиционными хостинговыми решениями.

    Лямбда ценообразование выглядит следующим образом:

    • $ 0,20 за 1 миллион запросов
    • $ 0,00001667 за каждую ГБ-секунду вычислительного времени, с каждым выполнением, округленным до ближайших 100 мс

    Узнайте больше на: https://aws.amazon.com/lambda/pricing/

  • Встроенное автоматическое масштабирование

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

Cons

  • Непоследовательный местный рабочий процесс развития.

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

Основные понятия лямбда-ключа

Код функции и триггеры

Лямбда имеет две основные концепции: код и триггеры. Код не требует пояснений. В нашем случае это код JavaScript, который вы пишете и загружаете в Lambda для получения желаемого поведения.

После загрузки код не будет выполняться сам по себе. Лямбда имеет дополнительную концепцию, называемую «триггеры». Триггеры — это события, инициируемые другими сервисами AWS, которые передают данные в функцию Lambda для выполнения.

Некоторые примеры триггеров:

  • HTTP-запрос к AWS API Gateway запускает лямбда-код
  • Событие запускается с интервалом, как задание cron из CloudWatch Events
  • Таблица DynamoDB обновляется и запускает лямбда-код

Подпись функции лямбда-кода

Вы определяете лямбда-функцию, экспортируя обычную функцию из JavaScript, которая соответствует ожидаемой лямбда-сигнатуре.

exports.myLambdaFunction = (event, context, callback) => { // Use callback() and return } 

Функция получает три аргумента:

  1. событие — словарь пары ключ-значение «триггерных данных», который Lambda передает в функцию.

  2. контекст — внутренняя информация AWS, такая как идентификатор запроса AWS, время ожидания Lambda и информация журнала.
    Для получения дополнительной информации см .: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

  3. обратный вызов — стандартный асинхронный обработчик обратного вызова JavaScript.
    Для получения дополнительной информации см .: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-callback

Построение лямбда-функции

Чтобы приступить к созданию новой функции Lambda, посетите панель управления Lambda по адресу:
https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions?display=list

Это должно выглядеть примерно так:
Снимок экрана: приборная панель AWS Lambda

Нажмите синюю кнопку Создать лямбда-функцию, чтобы начать.

Выберите план

На следующем экране вам будет предложено выбрать чертеж и представить список чертежей с возможностью фильтрации. Выберите опцию « Пустая функция» , она должна быть первой в списке чертежей. Эта страница может использоваться в будущем для проверки других утилит Lambda.

Настроить триггер

Следующий экран — Configure Triggers, и он должен выглядеть следующим образом:

Снимок экрана "Настройка триггеров"

Нажмите Далее, чтобы обойти этот экран. Мы назначим триггер позже, после того, как настроим нашу функцию.

Настроить функцию

Снимок экрана с полями на экране настройки функции

В этом разделе мы дадим имя нашей лямбда-функции. Я буду использовать имя GithubGet . При желании вы также можете дать описание функции.

Указание лямбда-кода функции

По умолчанию для лямбда-интерфейса установлено значение « Редактировать код встроенным» . Вам должен быть представлен встроенный редактор с функцией примера, которая выглядит следующим образом:

Снимок экрана онлайн-редактора функций

Встроенный редактор требует небольших накладных расходов для запуска и запуска лямбда-кода, но для этого урока мы собираемся сделать что-то более продвинутое.

Создание сложных функций с зависимостями

В большинстве реальных сценариев вы захотите создавать более сложные функции, используя сторонние библиотеки, установленные через npm.

Давайте создадим пользовательскую функцию, которая использует зависимость npm, и загрузим ее в Lambda. Вы можете следовать приведенным ниже инструкциям или свободно загружать код из репозитория примеров .

Создание новой функции

Давайте настроим папку для нашей новой функции и изнутри инициализируем npm файлом package.json умолчанию:

 npm init -f 

Далее мы установим клиент GitHub:

 npm install github 

Создайте файл index.js со следующим кодом:

 var GitHubApi = require('github'); var github = new GitHubApi(); exports.handler = (event, context, callback) => { github.search.repos({ q: 'sitepoint', sort: 'stars' }, function(err, res){ if(err){ callback(err); } var results = res.items.map((repo) => { return { url: repo.html_url, stars: repo.stargazers_count }; }); callback(null, { statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify(results) }); }); }; 

Вот разбивка того, что делает этот код:

  1. Включая и инициализируя GitHub API.
  2. Определение handler функции, который соответствует лямбда-сигнатуре.
  3. Когда вызывается handler , он отправляет запрос поиска в GitHub для всех репозиториев, которые соответствуют ‘sitepoint’ в качестве запроса.
  4. С помощью формы ответа Github создается карта, которая включает URL и количество звезд для каждого репо.
  5. Наконец, вызов лямбда-обратного вызова с HTTP-ответом, подобным объекту, который соответствует ожидаемой интеграции API Gateway .

Загрузить в AWS Lambda

Создайте zip-файл из файлов функции, используя любую знакомую вам утилиту zip. Я использовал утилиту командной строки zip на OSX, вот так:

 zip -r lambdaupload.zip ./index.js ./node_modules/ 

Чтобы загрузить код в Lambda, измените параметр « Тип ввода кода» с « Редактировать встроенный код» на « Загрузить файл zip» и загрузите свой код с помощью формы.

Анимированный GIF, показывающий процесс загрузки в Lambda

Настройте обработчик функции и роль

В этом разделе мы хотим установить несколько значений. Обработчик — это ссылка на вашу функцию Lambda в загруженном файле JavaScript. По умолчанию это установлено в index.handler . Это соответствует нашему загруженному коду путем поиска index файла (в нашем случае это index.js ) и index.js оператора экспорта для функции- handler , которая соответствует нашему export.handler .

Заполните поля «Роль» следующей информацией, чтобы создать основную роль для нашей лямбда-функции:

  • Роль : Создать новую роль из шаблона (ов)
  • Название роли : LambdaGetRole
  • Шаблоны политик : простые разрешения Microservice

Скриншот настроек, упомянутых выше

Когда этот раздел будет завершен, нажмите синюю кнопку «Далее», чтобы продолжить. Вы должны увидеть экран «Обзор» с краткой информацией о конфигурации:

Экран просмотра с обобщением выбранных опций

Если все выглядит хорошо, нажмите кнопку Создать функцию , чтобы продолжить.

Назначение триггера для нашей новой функции

Теперь, когда наша функция была создана и инициализирована, нам нужен способ ее вызова. Пришло время назначить триггер для функции. Для нашего триггера мы будем использовать API Gateway.

API Gateway — это еще одна служба AWS, которая автоматически создает конечные точки HTTP, с которых можно настраивать ответы. Мы будем прикреплять нашу функцию Lambda в качестве ответа шлюза API.

  1. Нажмите «Триггеры»
  2. Нажмите «Добавить триггер»
  3. Нажмите на пустой квадрат рядом с лямбда
  4. Выберите «API-шлюз»
  5. В разделе «Безопасность» выберите «Открыть».
  6. Нажмите Отправить

Эти шаги показаны в следующем GIF:

Анимированное пошаговое руководство по добавлению триггера функции AWS Lambda

После успешного добавления триггера вы должны увидеть его прикрепленным к вашей функции на вкладке « Триггеры ».

Вкладка триггеры, показывающая недавно созданный триггер API Gateway

Там будет URL-адрес в списке под идентификатором шлюза API. Вы можете посетить этот URL в своем браузере и увидеть ответ JSON, подобный следующему:

 [{"url":"https://github.com/bodrovis/Sitepoint-source","stars":106}, {"url":"https://github.com/Azzurrio/moviestore","stars":80}, {"url":"https://github.com/bodrovis/SitepointMiniChat","stars":54}, {"url":"https://github.com/upchuk/d8-demo-modules","stars":34}, 

Поздравляем! Вы успешно развернули и запустили код на Lambda.

Следующие шаги и будущее лямбды

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

Бессерверные фреймворки

Процесс настройки Lambda, который был продемонстрирован в этой статье, является очень ручным и несколько эфемерным, но есть другие способы настройки и инициализации Lambda, основанные на AWS API.

В настоящее время на основе AWS API создаются некоторые фреймворки, которые помогают упростить этот процесс.

  • https://serverless.com/

    Безсерверный — самая надежная безсерверная инфраструктура на данный момент. Однако на момент написания этой статьи фреймворк претерпел серьезное обновление версии с 0.5 до официального релиза 1.0 . К сожалению, это обновление не имеет обратной совместимости. Большинство популярных плагинов от 0.5 в настоящее время сломаны в ожидании завершения версии 1.0 .

    Безсерверный, с его работающими плагинами, обещает предоставить очень полный опыт Lambda. Он обеспечивает локальную настройку среды разработки для быстрой итерации, автоматического развертывания лямбда-кода, нескольких промежуточных сред развертывания и многого другого.

  • https://open-lambda.org/

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

Как вы думаете?

Будете ли вы рассматривать FaaS для будущих проектов? Возможно, вы уже начали использовать Lambda как часть своей архитектуры приложений? В любом случае, я хотел бы услышать, что вы думаете. Пожалуйста, поделитесь своими мыслями в комментариях ниже!