Использование AWS с перехватчиками сборки Netlify
Раньше я писал об обновлении моего веб-сайта Gatsby для получения данных во время сборки, а не во время выполнения. Это означает, что сайт извлекает данные из внешних API-интерфейсов только во время процесса сборки, а не каждый раз, когда пользователь посещает сайт.
Я сделал это, потому что мои данные были довольно статичными - это список кофеен, который меняется всего раз в неделю.
Получение во время сборки идет с улучшенным UX и даже может сэкономить некоторые затраты. Но обратная сторона выборки во время сборки заключается в том, что при изменении данных - например, при добавлении нового магазина - обновленные данные не появятся на сайте, пока он не будет перестроен и повторно развернут.
Это означало, что после добавления каждой новой кофейни я должен был:
- Добавить новый магазин через мой веб-сайт (это должно быть записано в базу данных).
- Войдите в консоль Netlify и запустите сборку и развертывание сайта.
Это был не такой уж и долгий процесс, но когда нужно сделать более одного шага, остается место для автоматизации. Введите хуки сборки Netlify.
Автоматизация сборки с помощью крючков сборки Netlify
Хук сборки - это уникальная конечная точка URL, которую вы можете использовать для запуска сборки и развертывания вашего сайта. Вы можете сгенерировать URL привязки сборки из консоли Netlify в настройках сайта Build & Deploy:
Получив URL-адрес, просто отправьте ему запрос POST, и ваш сайт будет развернут из выбранной вами ветки.
У меня уже была лямбда-функция AWS, отвечающая за сохранение кофейни в таблице AWS DynamoDB, поэтому я обновил эту лямбда-выражение, чтобы также отправлять POST-запрос в обработчик сборки, если мне нужно повторное развертывание (если я установил флажок должен запускать развертывание). »При добавлении нового магазина через мой веб-сайт).
Дальнейшее развитие с помощью бессерверного приложения AWS
Моя первоначальная система работала отлично, но иногда очень интересно разрабатывать сторонний проект.
Вместо одной лямбда-функции, сохраняющей магазин и запускающей сборку, я хотел иметь лямбда-функцию для каждой ответственности.
Первая лямбда сохранит магазин, а вторая лямбда запустит сборку, если она потребуется. С помощью AWS Simple Notification Service (SNS) заставить эти лямбда-функции взаимодействовать друг с другом было просто.
В результате я получил следующую архитектуру:
Когда магазин добавляется через веб-сайт, запускается все бессерверное приложение AWS:
- Шлюз API получает данные формы и запускает функцию
PostShopLambda
. - Функция
PostShopLambda
получает данные формы и всегда сохраняет магазин в таблицу DynamoDB. - Если параметр
triggerDeploy
данных формы имеет значение true (флажок установлен в форме), тоPostShopLambda
также опубликует сообщение по определенной теме в социальных сетях. - Как только сообщение попадет в тему SNS, подписавшийся
TriggerDeployLambda
увидит сообщение и узнает, что нужно повторно запустить сборку и развертывание сайта с помощью веб-перехватчика Netlify.
Большую часть работы выполняет функция PostShopLambda
. Он всегда сохраняет магазин в базе данных, а также может публиковать сообщение SNS для запуска развертывания, если это необходимо.
Эти основные части функции выглядят так:
Если сообщение опубликовано в теме SNS, будет вызвана функция подписки TriggerDeployLambda
.
Как я упоминал ранее, обработчик сборки - это просто URL-адрес, на который вы можете отправить запрос POST, что означает, что функция TriggerDeployLambda
невероятно проста:
Обратите внимание, что URL-адрес также имеет заголовок триггера, который отображается в списке сборки сайта, что позволяет легко отличить эти автоматические развертывания от других.
Модель бессерверного приложения AWS (SAM)
Все это было построено с использованием модели бессерверных приложений (SAM), которая упрощает настройку бессерверных приложений на AWS.
Все приложение описано в одном template.yaml
файле. Здесь перечислены все ресурсы AWS приложения (лямбда-функции, таблица DynamoDB и т. Д.), А также описано, как эти ресурсы взаимодействуют друг с другом посредством подписок, разрешений и т. Д.
Полный код этого примера можно найти на GitHub.