Маршрутизация на основе тела в AWS API Gateway с использованием Proxy Lambda — развернута с помощью AWS SAM
Введение
В моей предыдущей статье мы создали бота Discord, используя AWS Lambda. Мы просмотрели все на портале AWS, и все было хорошо. Мы настроили шлюз API и лямбду hello world.
Но я скрыл одну маленькую деталь.
Создание бессерверного приложения должно означать создание одной лямбда-функции для каждой обязанности — это называется принципом единой ответственности. В статье у нас была только одна обязанность. Взглянем:
Теперь представьте, что мы добавляем в этот файл вторую функцию. И третий. Прохладный. И эти функции, наверное, не просто отвечают строкой, а выполняют какой-то рендеринг/вычисления/что-то еще. И становятся крупнее. Большой.
Сейчас мы реализовали основной антипаттерн для Serverless — Лямбда-монолит.
И что теперь?
Мы хотим обрабатывать различные взаимодействия пользователей Discord, делегируя каждое взаимодействие разным Lambda. Проблема в том, что Discord отправляет все события в одну конечную точку. Шлюз API может изначально направлять запросы к Lambda на основе заголовка запроса и путей, но маршрутизация по телу запроса требует использования сопоставления шаблонов, что непросто и ограничено.
Нам нужно что-то для проксирования запроса.
Архитектура
Мы будем использовать Proxy API Gateway и Proxy Lambda для обработки запросов, идущих по пути /
(прокси-часть). Затем мы направим его в тему SNS со специальным параметром, который дополнительно разделит события на основные лямбда-выражения.
Эта архитектура:
- Заставляет Proxy Lambda работать только во время маршрутизации.
Proxy Lambda не запускается, когда Main Lambda обрабатывает запросы (как это происходит с вложенными Lambdas). - Разделяет прокси- и основную части.
Это помогает в разработке, тестировании и миграции из других бессерверных приложений (т. е. не Discord). - Делает Proxy Lambda идеальным местом для проверки запроса Discord.
Поток данных:
- Пользователь отправляет
/hello
на канал Discord - Сервер приложений Discord отправляет событие на URL-адрес вашего прокси-шлюза API (устанавливается в настройках)
- Proxy API Gateway отправляет событие в Proxy Lambda
- Proxy Lambda проверяет запросы и отвечает серверу приложений Discord временным ответом «Загрузка…», который будет отображаться во время выполнения основной функции. Устанавливает MessageParameter для вызова имени команды для дальнейшей обработки.
- Простая служба уведомлений (SNS) получает событие. Обрабатывает событие с помощью соответствующей лямбды на основе MessageParameter.
- (Single Responsibility) Lambda обрабатывает событие и отправляет запрос POST с содержимым «Привет от Lambda!» вернуться к вебхуку Discord App Server.
- Сервер приложений Discord изменяет ответ на
/hello
на канале Discord с «Загрузка…» на «Привет от Lambda!».
Подготовка
Мы создадим это приложение с помощью инструмента «Инфраструктура как код» с AWS SAM и шаблоном из репозитория git. Как только вы клонируете этот шаблон, вам будет легко идти дальше и дальше с вашими собственными лямбда-выражениями.
Никогда не слышали об AWS SAM? Найдите краткий обзор в моей другой статье.
Требования
- AWS SAM CLI
- Аккаунт AWS с ключом доступа, который будет использоваться интерфейсом командной строки AWS.
5 шагов
1. Создайте приложение Discord
Перейдите на Портал разработчиков Discord → Новое приложение.
Бот → Добавить бота.
Пригласите бота в свою гильдию (меню OAuth2) с привилегиями Bot
, applications.commands
, Use Application Commands
и Send Messages
.
(дополнительная помощь)
2. Клонируйте шаблон и установите необходимые пакеты
mkdir my-serverless-discord-bot && \ cd my-serverless-discord-bot && \ sam init --location gh:jakjus/serverless-discord-bot && \ npm install
3. Зарегистрируйте команды
Получите идентификатор своей гильдии разработчиков (Discord Server), включив режим разработчика в настройках и щелкнув правой кнопкой мыши свою гильдию.
Получите идентификатор приложения и токен бота с портала разработчиков Discord.
Скопируйте .env.example
в .env
и заполните .env
реальными значениями.
Зарегистрировать команды на одну гильдию для развития (инстант):
node register_commands/register.js
4. Создайте и разверните приложение на AWS
node generate_template/generate.js && \ sam build && \ sam deploy --guided
Каждый ответ может быть ответом по умолчанию (просто нажмите Enter), кроме:
- При появлении запроса
[Some function] may not have authorization defined, Is this okay?
ответьтеy
5. Установите URL-адрес Discord Webhook
Предыдущая команда показывает вам:
------------------------------------------ Outputs ------------------------------------------ Key ProxyGWEndpoint Description API Gateway endpoint URL to pass to Discord Application Portal Value https://s0meur1.execute-api.zone -name-1.amazonaws.com/Prod/ ------------------------------------------
Описание вывода говорит само за себя.
Скопируйте URL-адрес и вставьте его обратно в поле URL-адрес конечной точки взаимодействия Discord Developer Portal.
Щелкните Сохранить изменения.
Сделанный!
Скажите /hello
своему новому боту.
Бот ответит следующим образом:
Теперь, некоторые второстепенные вещи, которые вы можете сделать
Сила инфраструктуры как кода, верно?
Заставьте функцию делать что-то еще
- Измените код в
src/modules/example/hello-from-lambda.js
- Запуск
sam build && sam deploy
Если вы сохранили входные значения во время запуска--guided
, вы можете запустить его без этого флага для повторного использования значений.
Добавьте свою функцию
- Создайте новую команду в
src/modules/example/another-one.js
, аналогичнуюhello-from-lambda.js
. У него должно быть другое имя в пределахexports.data
. - Создайте шаблон, зарегистрируйте команды, соберите и разверните, используя:
node generate_template/generate.js && \ node register_commands/register.js && \ sam build && sam deploy
Очистить
Все эти ресурсы находятся на уровне бесплатного пользования. По-прежнему приятно не забывать чистить ресурсы с помощью:
sam destroy
после того, как вы закончите.
Краткое содержание
В этой статье у вас есть:
- научились использовать шаблоны в AWS SAM
- понимать указанную бессерверную архитектуру и ее обоснование
- развернули полнофункциональное бессерверное приложение на AWS, которое постоянно прослушивает события
- и когда-либо
- или до истечения срока действия вашей кредитной карты
Настройка, которую мы выполнили, довольно сложна для понимания в начале. Вот почему методы AWS SAM и IaC делают так, что только один бедный человек должен пройти через все это. В данном случае этим человеком был я.
Вот шаблонный репозиторий. Взносы приветствуются.
Я много исследовал для этой статьи, но самый важный вопрос все еще остается.
Что вы будете строить с его помощью?