AWS все!

На прошлой неделе я написал руководство по созданию простого бессерверного API. Эта часть углубляется в создание полнофункционального бессерверного CRUD API, использующего DynamoDB. В этом руководстве мы создадим API, который выполняет следующие операции:

  • GET /books
  • POST /books
  • GET /books/{id}
  • PUT /books/{id}
  • DELETE /books/{id}

В этом руководстве в основном будет использоваться пользовательский интерфейс AWS. Если вы хотите прочитать руководство о том, как создать это приложение с помощью Инфраструктура как код, прочтите мою статью здесь.

Используемые технологии

В этом руководстве используются следующие технологии:

  • AWS Lambda для запуска кода без предоставления серверов.
  • AWS API Gateway для создания бессерверного API и управления им.
  • AWS Identity and Access Management (IAM) для создания роли для функций Lambda, которые мы создадим.
  • AWS DynamoDB для управляемой базы данных NoSQL

Настройка базы данных

Войдите в AWS и перейдите к сервису DynamoDB. Затем нажмите Создать таблицу:

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

AWS создаст для вас стол. После настройки перейдите на вкладку Элементы. Как и ожидалось, в вашей таблице нет элементов - скоро мы добавим несколько.

Создание роли лямбда

Если вы не знакомы с ролями AWS, они в основном используются для предоставления сервисам AWS внутреннего доступа друг к другу. Нам нужно создать роль, которую мы назначим нашим лямбда-функциям. Эта роль даст этим функциям разрешение на доступ к нашей DynamoDB таблице.

Перейдите к службе AWS IAM и нажмите Роли:

Нажмите Создать роль:

Выберите Lambda в качестве службы, которая будет использовать роль. Затем нажмите Далее: разрешения:

Теперь нам нужно привязать к этой роли политику разрешений. Найдите AmazonDynamoDBFullAccess, установите флажок и нажмите Далее: Теги.

Не добавляйте никаких тегов, так как они выходят за рамки этой статьи. Нажмите Далее и на странице обзора укажите название своей роли (я выбрал crud). Наконец, нажмите Создать роль:

Создание книжной лямбды

Перейдите к сервису Lambda в AWS и нажмите Создать функцию:

Нажмите Создавать с нуля, поскольку мы создаем эту функцию, исходя из первых принципов. Назовите свою функцию (я выбрал create-book), выберите Узел в качестве среды выполнения и для роли выполнения используйте роль с разрешениями, которые мы созданный ранее (crud в моем случае). Затем нажмите Создать функцию.

Затем вы должны увидеть страницу обзора вашей функции, которая содержит редактор кода. Вскоре мы изменим этот код, но сначала нажмите Проверить:

Затем вам будет предложено настроить тестовое событие, которое будет передано в вашу Lambda. А пока просто используйте шаблон Hello World, назовите свое мероприятие (я назвал свое CreateBook) и нажмите Сохранить:

Снова нажмите Test, и вы должны увидеть успешное выполнение, возвращающее Hello from Lambda:

Теперь мы можем заставить эту функцию что-то делать. Заполните функцию следующим закомментированным кодом:

Если вы нажмете Тест, вы должны увидеть ошибку выполнения. Это потому, что функция ожидает извлечь title из переданного событияbody. Мы можем исправить это, нажав Настроить тестовые события:

Измените событие на текст, показанный ниже, и нажмите Сохранить. Не беспокойтесь о слегка странном формате, это станет яснее позже, когда мы интегрируем эту функцию с API Gateway. Снова нажмите Проверить.

{
  "body": "{\"title\": \"Harry Potter\"}"
}

Надеюсь, ваша функция выполнится правильно и создаст в вашей таблице книжный элемент Гарри Поттер. Чтобы проверить, вернитесь к своей таблице в DynamoDb и проверьте элементы:

Создание лямбда-выражения Get Books:

Теперь, вместо того, чтобы проверять книги через пользовательский интерфейс DynamoDB, было бы здорово получить их через новую функцию Lambda. Вернитесь в службу Lambda и снова нажмите Создать функцию. Затем назовите свою функцию (я назвал свою get-books) и используйте роль crud:

Заполните вашу функцию следующим закомментированным кодом:

Нажмите Тест, настройте тестовое событие по умолчанию, снова нажмите Создать и Проверить функцию:

Если все настроено правильно, вы должны увидеть, что ваша функция возвращает книги в вашей таблице DynamoDB:

Создание API GET Books

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

Назовите свой API (я назвал свой Книги), выберите Региональный и нажмите Создать API. Здесь мы используем региональный API, так как использование CloudFront для расширения нашего API по всему миру выходит за рамки этого руководства.

Теперь, когда ваш API создан, мы собираемся создать ресурс. Щелкните раскрывающееся меню Действия, а затем нажмите Создать ресурс.

Назовите свой ресурс (я назвал свой книги) и нажмите Создать ресурс.

Теперь нам нужно создать различные методы на вашем ресурсе. Снова нажмите раскрывающееся меню Действия и на этот раз нажмите Создать метод:

Затем появляется небольшой раскрывающийся список с различными методами HTTP на выбор. В нашем случае мы собираемся использовать метод GET. После выбора щелкните значок галочки в виде круга.

Справа теперь вы можете настроить свой новый метод. Нам нужно связать метод GET books с get-books лямбда-функцией, которую мы создали ранее. Выберите Лямбда-функция в качестве типа интеграции и укажите get-books в качестве лямбда-функции, затем нажмите Сохранить.

Затем AWS показывает действительно четкую диаграмму всего потока:

Наш последний шаг - развернуть наш новый ресурс и метод API. Снова нажмите Действия и Развернуть API:

Затем появляется модальное окно с вопросом, на каком этапе вы хотите развернуть API. Создайте новый этап и назовите его production, прежде чем нажимать Развернуть.

После этого вы попадете на экран Этапы, где вам станет доступен развернутый домен. Нажмите Вызов URL, чтобы проверить его (не забудьте добавить books в конец предоставленного URL). Вы должны увидеть, как ваш books прошел:

Создание API POST Books

Теперь, когда GET Books API и функция get-books подключены, пора сделать то же самое для функции create-book. Вернитесь в Ресурсы, нажмите ресурс книги, нажмите раскрывающееся меню Действия и нажмите Создать метод:

На этот раз создайте метод POST и укажите свою лямбда-функцию как create-book. Нажмите Использовать интеграцию с лямбда-прокси и нажмите Сохранить.

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

Однако для метода POST мы хотим передать название книги при обращении к API.

Снова разверните свой API в рабочей среде и откройте свой любимый инструмент API. Затем выполните тестовый POST для своего API. В моем случае я заполнил тело запроса следующим образом:

{"title":"Lord of the Rings"}

Затем я получил 200 в ответ:

Если мы сейчас перейдем к GET Books API, мы увидим Властелин колец рядом с Гарри Поттером:

Получить Book Lambda и API

Следующим естественным шагом будет создание функции и API, которые получат отдельную книгу. Перейдите в службу Lambda и создайте новую функцию под названием get-book, которая использует нашу роль crud IAM.

Заполните свою функцию следующим закомментированным кодом: (Обратите особое внимание на id из извлечения pathParameters)

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

{
  "pathParameters": {
    "id": "a4850b12819e5f92c216222d51757378"
  }
}

Перейдите в API Gateway, щелкните книги и нажмите действие Создать ресурс:

На этот раз мы хотим создать ресурс наподобие GET books/{id}, который соответствует только что созданной нами лямбда-функции. Итак, назовите свой ресурс {id}, а также назовите путь к ресурсу {id}:

Установите флажок Использовать интеграцию лямбда-прокси, так как мы хотим получить доступ к id в нашей лямбда-функции, укажите свою функцию и нажмите Сохранить:

Затем разверните свой API и протестируйте его. Опять же, следует возвращать только одну книгу.

Удалить / обновить лямбда-выражения и API книги

Чтобы завершить наш API, нам нужно добавить методы и функции Delete books/{id} и Update books/{id}. Чтобы статья была краткой, я не буду приводить все скриншоты для этих шагов, поскольку они в основном такие же, как и для метода GET books/{id}. Для вас будет отличной практикой реализовать их самостоятельно, но я предоставил код функции, поэтому вам не нужно искать в документации DynamoDB SDK:

Код Удалить лямбда:

Код Обновить лямбда:

Заключение

Поздравляю, вы так далеко зашли! Если вы хотите расширить свой новый API, вы можете (среди прочего):

  • Добавить подтверждение запроса
  • Используйте AWS Cognito, чтобы запрашивать аутентификацию для доступа к вашим API
  • Разверните API в своем личном домене
  • Используйте ключи API, чтобы ограничить использование API

Я призываю вас глубже окунуться в чудесный мир AWS!

👋 Присоединяйтесь к нам сегодня !!

️ Подписывайтесь на нас в LinkedIn, Twitter, Facebook и Instagram

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку хлопка 👏 ниже, чтобы выразить свою поддержку! ⬇