Использование AWS с перехватчиками сборки Netlify

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

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

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

Это означало, что после добавления каждой новой кофейни я должен был:

  1. Добавить новый магазин через мой веб-сайт (это должно быть записано в базу данных).
  2. Войдите в консоль Netlify и запустите сборку и развертывание сайта.

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

Автоматизация сборки с помощью крючков сборки Netlify

Хук сборки - это уникальная конечная точка URL, которую вы можете использовать для запуска сборки и развертывания вашего сайта. Вы можете сгенерировать URL привязки сборки из консоли Netlify в настройках сайта Build & Deploy:

Получив URL-адрес, просто отправьте ему запрос POST, и ваш сайт будет развернут из выбранной вами ветки.

У меня уже была лямбда-функция AWS, отвечающая за сохранение кофейни в таблице AWS DynamoDB, поэтому я обновил эту лямбда-выражение, чтобы также отправлять POST-запрос в обработчик сборки, если мне нужно повторное развертывание (если я установил флажок должен запускать развертывание). »При добавлении нового магазина через мой веб-сайт).

Дальнейшее развитие с помощью бессерверного приложения AWS

Моя первоначальная система работала отлично, но иногда очень интересно разрабатывать сторонний проект.

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

Первая лямбда сохранит магазин, а вторая лямбда запустит сборку, если она потребуется. С помощью AWS Simple Notification Service (SNS) заставить эти лямбда-функции взаимодействовать друг с другом было просто.

В результате я получил следующую архитектуру:

Когда магазин добавляется через веб-сайт, запускается все бессерверное приложение AWS:

  1. Шлюз API получает данные формы и запускает функцию PostShopLambda.
  2. Функция PostShopLambda получает данные формы и всегда сохраняет магазин в таблицу DynamoDB.
  3. Если параметр triggerDeploy данных формы имеет значение true (флажок установлен в форме), то PostShopLambda также опубликует сообщение по определенной теме в социальных сетях.
  4. Как только сообщение попадет в тему SNS, подписавшийся TriggerDeployLambda увидит сообщение и узнает, что нужно повторно запустить сборку и развертывание сайта с помощью веб-перехватчика Netlify.

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

Эти основные части функции выглядят так:

Если сообщение опубликовано в теме SNS, будет вызвана функция подписки TriggerDeployLambda.

Как я упоминал ранее, обработчик сборки - это просто URL-адрес, на который вы можете отправить запрос POST, что означает, что функция TriggerDeployLambda невероятно проста:

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

Модель бессерверного приложения AWS (SAM)

Все это было построено с использованием модели бессерверных приложений (SAM), которая упрощает настройку бессерверных приложений на AWS.

Все приложение описано в одном template.yaml файле. Здесь перечислены все ресурсы AWS приложения (лямбда-функции, таблица DynamoDB и т. Д.), А также описано, как эти ресурсы взаимодействуют друг с другом посредством подписок, разрешений и т. Д.

Полный код этого примера можно найти на GitHub.