"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > AWS 클라우드를 위한 간단한 SaaS의 기술 스택

AWS 클라우드를 위한 간단한 SaaS의 기술 스택

2024-11-08에 게시됨
검색:386

The Tech Stack of a Simple SaaS for AWS Cloud

소개


참고 1: 호스팅된 대화형 데모는 다음과 같습니다. 데모.saasconstruct.com

참고 2: 각 SaaS 설정에 대한 월별 청구서는 월 3~5달러이며 대부분 CI/CD 비용입니다.

참고 3: 템플릿은 여기에 있습니다: saasconstruct.com.


AWS에서 여러 AI PoC와 MVP를 수행했는데 항상 비슷합니다.:

  • 프런트엔드를 어딘가에 호스팅
  • 백엔드에 전화 걸기
  • 백엔드는 바이너리 저장소/데이터베이스에서 데이터를 가져오거나 업데이트합니다.
  • 백엔드는 AI 로직을 수행하거나 다른 서비스를 호출하고 결과를 다시 보냅니다.
  • 2개의 격리된 AWS 계정(dev 및 prod)이 있습니다.
  • 배포용 CI/CD
  • 클라우드 리소스 선언을 위한 코드형 인프라

그래서 저는 AWS에서 이러한 것들을 부트스트랩하는 간단한 솔루션을 구축해야겠다고 생각했습니다. 그리고 이에 대한 블로그 게시물을 작성하세요.

Stripe 결제(판매세/VAT에 대해 걱정하고 싶지 않은 경우 LemonSqueezy 결제), 결제 관리, 인증, 교통 경보 등과 같은 몇 가지 기능을 추가하기로 결정했습니다. 또한 더 긴 작업을 위해 API Gateway 및 AWS Lambda를 ELB 및 ECS로 교체하는 등 구성 가능해야 한다고 생각했습니다.

프런트엔드

저는 일반적으로 선언되는 가장 쉬운 프레임워크를 선택했습니다. 그것은 Vue이고 제가 이해한 한 두 번째로 인기 있는 프레임워크입니다. 가장 쉬울 뿐만 아니라 경험도 좀 있어서 골랐습니다.

이 웹사이트는 Vite를 빌드 도구로 사용하는 표준 SPA 애플리케이션입니다. 스타일링을 위해 Bootstrap을 사용하는 이유는 작업하기가 매우 쉽고 프런트엔드 프레임워크의 한 버전에서 다른 버전으로 마이그레이션할 때 많은 어려움을 초래하지 않기 때문입니다.

프런트엔드 호스팅

두 가지 옵션이 있습니다:

  • S3 및 CloudFront(CDN)
  • S3 및 CloudFront를 둘러싼 래퍼인 AWS Amplify Hosting은 작업하기 쉽지만 구성 가능성이 낮습니다. 예를 들어 CloudFront 배포는 표시되지 않으므로 아무 것도 할 수 없습니다. 또한 리디렉션을 사용하는 경우를 제외하고는 애플리케이션을 지리적으로 차단할 수 없습니다.

저는 프런트엔드 호스팅 솔루션에서 AWS의 주요 초점으로 Amplify Hosting을 선택했습니다. 설정, 도메인 연결 등이 쉽기 때문입니다.

선불제이기 때문에 교통알람을 설정해 놓았습니다. 10초당 일정 조회수 이상이면 알림이 옵니다.

백엔드

백엔드는 속도 제한을 수행하는 API 게이트웨이와 비즈니스 및 일반 논리를 수행하는 AWS Lambda(Python)입니다.

  • 사용자가 인증되었는지 확인하는 중
  • 결제 처리 및 구독 관리(고객 포털)
  • 이메일 보내기
  • 등.

Cognito에 가입한 후 데이터베이스에 사용자를 생성하는 또 다른 AWS Lambda 함수도 있습니다.

예를 들어 이메일 보내기와 같은 몇 가지 공유 기능을 추가하는 공유 유틸리티가 있습니다. 또한, 결제 오류가 발생한 경우 이메일 등의 로깅 기능도 제공됩니다.

입증

인증이 고통스럽다는 것을 알고 있으며 제3자 서비스를 사용하고 싶지 않았습니다. 그래서 저는 AWS Cognito를 계속 사용했습니다. 꽤 저렴해요.

AWS Amplify Auth(AWS Cognito의 래퍼)를 사용한다고 말할 수 있지만 몇 가지 문제가 있었습니다. Reddit에 글도 썼습니다:

인증을 위한 Amplify 관련 문제 목록

그리고 실망한 일부 사용자의 훨씬 더 큰 목록이 포함된 또 다른 게시물이 있습니다(하지만 오래된 게시물입니다).

여기

게다가 Amplify만 사용하면 아무것도 변경할 기회 없이 전체 생태계에 갇혀 있게 됩니다. 예를 들어 CloudFront 배포에 액세스하려는 경우(예: 특정 지역을 지리적으로 차단하려는 경우) 불행하게도 Amplify Hosting에서는 이를 볼 수 없습니다. 또한 다른 문제도 있었습니다. 예 중 하나는 Amplify 리소스에서 CDK를 생성하는 것인데, 이는 저에게 어려운 점이었습니다.

그래서 제가 한 것은 하이브리드 접근 방식입니다(Reddit에 따르면 다소 인기가 있음). AWS Amplify JS 라이브러리를 사용하면 사용자 풀처럼 직접 생성한 클라우드 리소스를 가져올 수 있으므로 이를 생성했습니다. CDK를 사용하고 인증을 위해 Amplify JS 라이브러리를 사용했습니다.

이 경우 언제든지 원하는 대로 변경하고 클라우드 리소스를 교환할 수 있습니다. 예를 들어 CloudFront 배포에 액세스해야 하는 경우 Amplify Hosting에서 CloudFront S3로 이동할 수 있습니다.

이메일

AWS SES. 주요 AWS 이메일 서비스입니다. Cognito 인증 이메일, 연락처 양식의 요청 등을 포함한 모든 것을 보냅니다. 이해해야 할 유일한 것은 개발자 AWS 계정에서 보낼 수 있으려면 먼저 확인된 ID를 생성해야 한다는 것입니다. IaC), 프로덕션 AWS 계정에서는 프로덕션 액세스를 요청해야 합니다(단 몇 번의 클릭만으로 가능).

AWS SES를 사용하면 다음 시나리오에서 이메일 알림이 전송됩니다.

  • 결제 오류가 발생한 경우.
  • 웹 트래픽이 급증하는 경우.
  • CI/CD 출시가 실패한 경우.
  • 인증 메일, 문의 양식을 통한 문의 등 기타 상황의 경우

저장

DynamoDB를 데이터베이스로 사용합니다. 쉽고 빠르며 관리됩니다. 예, 액세스 패턴에 대해 생각해야 했지만 일반적으로 사용하기 좋으며 검증/구축하는 동안 비용이 전혀 들지 않습니다. 여러 제품에 대한 작업을 계획하고 이를 격리된 상태로 유지하고 싶기 때문에 프로젝트당 개발 및 프로덕션 계정에 RDS/DocumentDB를 넣을 수 없습니다(비용이 너무 많이 듭니다).

결제

두 개의 결제 시스템을 추가했는데, 비슷하게 작동하기 때문에 어느 것을 사용할지 선택할 수 있습니다.

  • 스트라이프는 대중적이고 통합하기 쉽고 단순하고 단순합니다. 사용자가 제품을 구매할 때는 Stripe 결제를 사용하고, 구독 관리는 Stripe 고객 포털을 사용합니다.
  • LemonSqueezy는 Stripe과 매우 유사하지만 등록된 판매자이기도 합니다. 이는 판매세/VAT 세금을 대신 처리한다는 의미입니다. 또한 구독 구매를 위한 체크아웃과 구독 관리를 위한 고객 포털도 있습니다.

모든 로직을 처리하는 Stripe/LemonSqueezy 웹후크에 대해 제가 작성한 엔드포인트가 있습니다.

코드로서의 인프라

따라서 선택할 수 있는 것이 많습니다:

  • Terraform 또는 OpenTofu와 같은 것(Terraform을 기반으로 하는 완전 오픈 소스 대안)
  • 풀루미
  • CDK
  • 클라우드 형성

AWS CDK를 선택했는데 그 이유는 다음과 같습니다.

  • 작업하기 쉽습니다.
  • 충분히 대중적이고 성숙하다
  • 제 생각에는 AWS CloudFormation보다 훨씬 낫습니다.
  • AWS 라이브러리입니다. 저는 AWS를 사용합니다.
  • Python, TypeScript 또는 기타 언어로 작성할 수 있습니다. 저는 백엔드에서 Python을, 프론트엔드에서 TypeScript를 사용하기 때문에 좋은 선택입니다.

Terraform을 선택하지 않은 이유는 CDK가 더 쉽기 때문입니다. 적어도 제 생각에는 간단한 방식으로 리소스를 생성할 수 있습니다. 나는 OOP를 좋아하고 이에 맞춰 클라우드 인프라를 구축하려고 노력합니다. 가장 큰 장점은 CI/CD가 포함되어 있으므로(CDK 파이프라인) 이를 고안할 필요가 없다는 점입니다.

CI/CD

제가 CDK 파이프라인을 선택한 이유는 역시 쉽기 때문입니다. 파이프라인을 GitHub 저장소에 연결하기만 하면 됩니다. 개발 브랜치로 Git 푸시 -> 개발 계정으로 롤아웃됩니다. 메인(또는 풀 요청)으로 Git 푸시 -> 프로덕션 롤아웃.

경보 및 속도 제한

API 게이트웨이를 통해 스팸을 받는 것을 방지하기 위해 속도 제한을 설정했습니다. 두 개의 CloudWatch 경보:

를 설정했습니다.
  • 호스팅된 웹사이트가 요청으로 스팸을 받을 때 알림을 받기 위해.
  • API 게이트웨이가 요청으로 스팸을 받을 때 알림을 제공합니다.

또한 지출이 너무 많을 경우 알림을 받을 수 있도록 결제 알람을 설정했습니다.

벌채 반출

CloudWatch는 이벤트를 기록하므로 AWS 콘솔과 확장 프로그램을 통해 IDE에서 직접 볼 수 있습니다.

일체 포함

OpenAI(GPT 모델 포함) 또는 AWS Bedrock(Claude 모델 포함) 중 하나를 선택했습니다. AWS Bedrock with Claude는 AWS와 쉽게 통합되지만 OpenAI가 더 일반적으로 사용되기 때문에 이 결정은 어려웠습니다. 두 회사 모두 최고 수준의 AI 모델을 제공합니다. 지금은 AWS Bedrock을 선택했습니다. 이는 향후 변경될 수 있지만 지금은 단순함을 높이 평가합니다. 벡터 데이터베이스로는 서버리스 인덱스가 있는 Pinecone을 사용합니다.

제가 여기서 구축한 AI 애플리케이션의 예로는 RAG 시스템이 있는데, 이는 기본적으로 데이터를 기반으로 질문에 답할 수 있는 챗봇입니다. 벡터 데이터베이스에 정보를 저장하고 쿼리에 대해 유사성 검색을 수행한 다음 LLM을 사용하여 해당 검색 결과를 기반으로 답변을 제공합니다. 현재는 비용을 피하기 위해 간단한 모델을 사용하고 있지만 다른 모델로 전환하는 것은 코드 한 줄만 변경하는 것만큼 간단합니다.

프로그래밍 언어

처음에는 Java 개발자였지만, 머신러닝과 딥러닝 서비스를 개발하면서 Python 개발자가 되었습니다. 해당 공간에서 대부분의 라이브러리는 Python으로 개발되거나 Python 래퍼를 특징으로 합니다. 게다가 Python은 AWS Lambda(예: AWS Lambda Powertools 라이브러리 사용) 또는 CDK에서 AWS와 원활하게 통합됩니다. 따라서 결국 백엔드와 클라우드 인프라(CDK를 통해) 모두 Python으로 구현됩니다.

내 보조 언어는 프런트엔드 프레임워크에서 인기가 높기 때문에 TypeScript입니다. JavaScript로 작업하는 동안 코드베이스가 커짐에 따라 유형이 없다는 것이 혼란스럽다는 것을 알았습니다. TypeScript의 정적 타이핑은 특히 대규모 프로젝트에서 개발 중에 꼭 필요한 명확성과 안전성을 제공합니다.

AWS 청구서

트래픽 부하가 높지 않기 때문에 AWS 비용은 매우 낮습니다. 일반적으로 월 3~5달러 주로 CI/CD 비용 때문입니다.

설정에는 CDN(Amplify Hosting에서 제공)과 AWS Lambda 내의 작은 캐싱 계층이 포함됩니다. 또한 일부 서비스는 AWS 프리 티어에 속하므로 비용이 더욱 절감됩니다.

제품이 확장되고 더 많은 사용자가 확보됨에 따라 프로비저닝된 DynamoDB로 전환하고 DAX(DynamoDB Accelerator)를 구현하여 리소스를 최적화해야 할 수도 있습니다. 그러나 현재로서는 이 설정이 완벽하게 작동합니다.

결론

이 솔루션은 현재 요구 사항을 효율적으로 충족합니다.

저는 이 전체 기술 스택을 SaaSConstruct의 AWS 템플릿보일러플레이트(적극적으로 개발하고 업데이트함)로 포함시켰습니다.

이 설정에 통합하여 기능을 향상시킬 수 있는 추가 기능을 계속 탐색하겠습니다...

릴리스 선언문 이 기사는 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