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

Эта архитектура:

  1. Заставляет Proxy Lambda работать только во время маршрутизации.
    Proxy Lambda не запускается, когда Main Lambda обрабатывает запросы (как это происходит с вложенными Lambdas).
  2. Разделяет прокси- и основную части.
    Это помогает в разработке, тестировании и миграции из других бессерверных приложений (т. е. не Discord).
  3. Делает 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), кроме:

  1. При появлении запроса [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 своему новому боту.

Бот ответит следующим образом:

Теперь, некоторые второстепенные вещи, которые вы можете сделать

Сила инфраструктуры как кода, верно?

Заставьте функцию делать что-то еще

  1. Измените код в src/modules/example/hello-from-lambda.js
  2. Запуск sam build && sam deploy
    Если вы сохранили входные значения во время запуска --guided, вы можете запустить его без этого флага для повторного использования значений.

Добавьте свою функцию

  1. Создайте новую команду в src/modules/example/another-one.js, аналогичную hello-from-lambda.js. У него должно быть другое имя в пределах exports.data .
  2. Создайте шаблон, зарегистрируйте команды, соберите и разверните, используя:
node generate_template/generate.js && \
node register_commands/register.js && \
sam build && sam deploy

Очистить

Все эти ресурсы находятся на уровне бесплатного пользования. По-прежнему приятно не забывать чистить ресурсы с помощью:

sam destroy

после того, как вы закончите.

Краткое содержание

В этой статье у вас есть:

  • научились использовать шаблоны в AWS SAM
  • понимать указанную бессерверную архитектуру и ее обоснование
  • развернули полнофункциональное бессерверное приложение на AWS, которое постоянно прослушивает события
  • и когда-либо
  • или до истечения срока действия вашей кредитной карты

Настройка, которую мы выполнили, довольно сложна для понимания в начале. Вот почему методы AWS SAM и IaC делают так, что только один бедный человек должен пройти через все это. В данном случае этим человеком был я.

Вот шаблонный репозиторий. Взносы приветствуются.



Я много исследовал для этой статьи, но самый важный вопрос все еще остается.

Что вы будете строить с его помощью?