«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Технический стек простого SaaS для облака AWS

Технический стек простого SaaS для облака AWS

Опубликовано 8 ноября 2024 г.
Просматривать:449

The Tech Stack of a Simple SaaS for AWS Cloud

Введение


Примечание 1. Вот размещенная интерактивная демонстрация: demo.saasconstruct.com

Примечание 2. Мой ежемесячный счет за каждую установку SaaS составляет 3–5 долларов США в месяц, и в основном это затраты на CI/CD.

Примечание 3. Шаблон находится здесь: saasconstruct.com.


Я сделал несколько PoC и MVP для ИИ на AWS, и это всегда одно и то же:

  • Разместите где-нибудь интерфейс
  • Вызов на серверную часть
  • Бэкэнд получает/обновляет данные из двоичного хранилища/базы данных
  • Бэкэнд выполняет какую-то логику искусственного интеллекта или вызывает другую службу и отправляет результат
  • Существует две изолированные учетные записи AWS: dev и prod
  • CI/CD для развертываний
  • Инфраструктура как код для декларации облачных ресурсов

Итак, я подумал, что смогу создать простое решение для загрузки таких вещей на AWS. И напишите об этом сообщение в блоге.

Я решил добавить некоторые функции, такие как платежи Stripe (и платежи LemonSqueezy, если вы не хотите беспокоиться о налоге с продаж / НДС), а также управление платежами, аутентификацию, дорожную сигнализацию и другие. Я также считал, что его необходимо настраивать, например, заменять API Gateway и AWS Lambda на ELB и ECS для более длительных задач.

Внешний интерфейс

Для начала я выбрал общепризнанную самую простую структуру. Это Vue и, насколько я понял, второй по популярности фреймворк. Я выбрал его, потому что он не только самый простой, но и у меня был некоторый опыт работы с ним.

Веб-сайт представляет собой стандартное SPA-приложение с Vite в качестве инструмента сборки. Для стилизации я использую Bootstrap, потому что с ним очень легко работать, а также потому, что он не вызывает особых хлопот при переходе с одной версии frontend framework на другую.

Фронтенд-хостинг

Есть два варианта:

  • S3 и CloudFront (CDN)
  • Хостинг AWS Amplify, который представляет собой оболочку S3 и CloudFront, с ним легко работать, но его сложнее настроить. Например, с дистрибутивом CloudFront ничего сделать нельзя, так как он не виден. Вы также не можете геоблокировать свое приложение, кроме как с помощью перенаправления.

Я выбрал Amplify Hosting в качестве основного направления AWS в области решений внешнего хостинга, а также потому, что его легко настроить, прикрепить домен и т. д.

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

Бэкэнд

Бэкэнд — это API-шлюз, который ограничивает скорость, и AWS Lambda (Python), который выполняет бизнес-логику и общую логику:

  • Проверка подлинности пользователя
  • Обработка платежей и управление подписками (портал для клиентов)
  • Отправка электронных писем
  • и т. д.

У меня также есть еще одна функция AWS Lambda, которая создает пользователя в базе данных после регистрации в Cognito.

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

Аутентификация

Я знаю, что аутентификация — это боль, и я не хотел использовать сторонний сервис. Поэтому я остался с AWS Cognito. Это довольно дешево.

Можно сказать, просто используйте AWS Amplify Auth (оболочка AWS Cognito), но у меня с этим возникли некоторые проблемы. Я даже написал пост на Reddit:

Мой список проблем с Amplify для аутентификации

И есть еще один пост с еще большим списком от какого-то разочарованного пользователя (правда, это старый пост).

здесь

Кроме того, если вы используете только Amplify, вы застреваете во всей экосистеме и не имеете возможности что-то изменить. Например, если вы хотите иметь доступ к дистрибутиву CloudFront (например, если вы хотите геоблокировать определенные регионы), к сожалению, вы не сможете увидеть его с помощью Amplify Hosting. У меня были и другие проблемы: одним из примеров было создание CDK из ресурсов Amplify, что было для меня болевой точкой.

Итак, я использовал гибридный подход (который, согласно Reddit, довольно популярен): Библиотека AWS Amplify JS позволяет вам импортировать облачные ресурсы, которые вы создаете самостоятельно, например пулы пользователей, поэтому я создал их. с CDK, а затем просто использовал библиотеку Amplify JS для аутентификации.

В этом случае я всегда могу изменить все, что захочу, поменять местами облачные ресурсы (например, я могу перейти с хостинга Amplify на CloudFront S3, если мне нужен доступ к дистрибутиву CloudFront).

Электронная почта

AWS SES. Это основной сервис электронной почты AWS. Он отправляет все, включая электронные письма для аутентификации Cognito, запросы из контактной формы и т. д. Единственное, что вам нужно понять, это то, что в вашей учетной записи разработчика AWS вам нужно будет сначала создать проверенные личности, чтобы иметь возможность отправлять (я автоматизировал это через IaC), а в рабочей учетной записи AWS вам нужно будет запросить доступ к рабочей среде (это всего лишь пара кликов).

При использовании AWS SES уведомления по электронной почте отправляются в следующих сценариях:

  • При возникновении ошибок оплаты.
  • На случай скачков веб-трафика.
  • Если развертывание CI/CD не удалось.
  • Для других ситуаций, таких как аутентификация по электронной почте, запросы из контактной формы и т. д.

Хранилище

DynamoDB в качестве базы данных. Легко, быстро и управляемо. Да, мне пришлось подумать о шаблонах доступа, но в целом с ними приятно работать, и мне ничего не стоит, пока я проверяю/собираю. Поскольку я планирую работать над несколькими продуктами и хочу держать их изолированными, я не могу разместить RDS/DocumentDB в учетных записях разработчиков и продуктов для каждого проекта (это слишком дорого стоит).

Платежи

Я добавил две платежные системы, и можно выбрать, какую использовать, поскольку они работают одинаково:

  • Stripe популярен, легко интегрируется, прост и понятен. Когда пользователь покупает продукт, я использую Stripe checkout, а для управления подписками я использую портал клиентов Stripe.
  • LemonSqueezy очень похож на Stripe, но он также является зарегистрированным продавцом, что означает, что он обрабатывает за вас налог с продаж/НДС. Также есть касса для покупки подписки и клиентский портал для управления ими.

Я написал конечные точки для веб-хуков Stripe/LemonSqueezy, которые обрабатывают всю логику.

Инфраструктура как код

Так что есть из чего выбирать:

  • Что-то вроде Terraform или OpenTofu (альтернатива с полностью открытым исходным кодом, основанная на Terraform)
  • Пулуми
  • CDK
  • Облачное формирование

Я выбрал AWS CDK, и вот мои причины:

  • С ним легко работать
  • Он популярен и достаточно зрелый
  • На мой взгляд, это намного лучше, чем AWS CloudFormation
  • Это библиотека AWS, и я использую AWS
  • Я могу написать это на Python, TypeScript или других языках. Поскольку я использую Python на серверной части и TypeScript на внешней стороне, это хороший выбор.

Причина, по которой я не выбрал Terraform, заключается в том, что CDK проще; это позволяет создавать ресурсы простым способом, по крайней мере, на мой взгляд. Мне нравится ООП, и я стараюсь построить свою облачную инфраструктуру соответствующим образом. Большим преимуществом является то, что включен CI/CD (конвейеры CDK), поэтому мне не нужно это изобретать.

CI/CD

Я выбрал конвейеры CDK, потому что это, опять же, просто. Просто подключите конвейер к репозиторию GitHub, и все готово. Git push в ветку разработки -> он будет развернут на учетную запись разработки. Git push в главную (или запрос на включение) -> производственное развертывание.

Сигналы тревоги и ограничения скорости

Я настроил ограничение скорости, чтобы предотвратить получение спама через шлюз API. Я установил два будильника CloudWatch:

  • Чтобы предупредить меня, когда на размещенный веб-сайт поступает спам с запросами.
  • Чтобы предупредить меня, когда шлюз API получает спам с запросами.

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

Ведение журнала

CloudWatch регистрирует события, их можно увидеть как в консоли AWS, так и непосредственно в IDE через расширения.

ИИ

Выбор был между использованием OpenAI (с моделями GPT) или AWS Bedrock (с моделями Claude). Это решение было непростым, поскольку, хотя AWS Bedrock с Claude легко интегрируется с AWS, чаще используется OpenAI. Обе компании предлагают модели искусственного интеллекта высшего уровня. На данный момент я решил придерживаться AWS Bedrock. Возможно, в будущем это изменится, но сейчас я ценю простоту. Для векторной базы данных я использую Pinecone, который имеет бессерверные индексы.

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

Языки программирования

Изначально я был разработчиком Java, но затем стал разработчиком Python, потому что разработал сервисы машинного и глубокого обучения. Большинство библиотек в этой области разработаны на Python или имеют оболочку Python. Кроме того, Python легко интегрируется с AWS, будь то в AWS Lambda (например, с использованием библиотеки AWS Lambda Powertools) или в CDK. Таким образом, в конечном итоге и серверная часть, и облачная инфраструктура (через CDK) реализованы на Python.

Мой дополнительный язык — TypeScript из-за его популярности во внешних платформах. Раньше я работал с JavaScript, но отсутствие типов сбивало меня с толку по мере того, как кодовая база росла. Статическая типизация TypeScript обеспечивает столь необходимую ясность и безопасность во время разработки, особенно в крупных проектах.

Счета за AWS

Поскольку у меня нет высокой нагрузки на трафик, мои расходы на AWS очень низкие, обычно 3-5 долларов в месяц, в основном за счет расходов на CI/CD.

Установка включает в себя CDN (предоставленную Amplify Hosting) и небольшой уровень кэширования в AWS Lambda. Кроме того, некоторые сервисы подпадают под действие Уровня бесплатного пользования AWS, что еще больше снижает мои расходы.

По мере масштабирования продукта и привлечения большего числа пользователей мне, возможно, придется оптимизировать ресурсы, перейдя на подготовленную DynamoDB и внедрив DAX (DynamoDB Accelerator). Однако на данный момент эта настройка работает отлично.

Заключение

Это решение эффективно отвечает моим текущим потребностям.

Я включил весь этот набор технологий в качестве шаблона (который я активно разрабатываю и обновляю) в свой шаблон AWS на SaaSConstruct.

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/server_kota/the-tech-stack-of-a-simple-saas-for-aws-cloud-4lhm?1 Если есть какие-либо нарушения, свяжитесь с Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3