„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Der Tech Stack eines einfachen SaaS für AWS Cloud

Der Tech Stack eines einfachen SaaS für AWS Cloud

Veröffentlicht am 08.11.2024
Durchsuche:400

The Tech Stack of a Simple SaaS for AWS Cloud

Einführung


Hinweis 1: Hier ist die gehostete interaktive Demo: demo.saasconstruct.com

Hinweis 2: Meine monatliche Rechnung für jedes SaaS-Setup beträgt 3–5 $ pro Monat und besteht hauptsächlich aus CI/CD-Kosten.

Hinweis 3: Die Vorlage finden Sie hier: saasconstruct.com.


Ich habe mehrere KI-PoCs und MVPs auf AWS durchgeführt, und es sind immer ähnliche Dinge:

  • Hosten Sie das Frontend irgendwo
  • Rufen Sie das Backend auf
  • Das Backend ruft/aktualisiert Daten aus dem Binärspeicher/der Binärdatenbank
  • Das Backend führt eine KI-Logik aus oder ruft einen anderen Dienst auf und sendet das Ergebnis zurück
  • Es gibt zwei isolierte AWS-Konten: dev und prod
  • CI/CD für Bereitstellungen
  • Infrastruktur-as-Code für die Deklaration von Cloud-Ressourcen

Also dachte ich, ich würde eine einfache Lösung entwickeln, um solche Dinge auf AWS zu booten. Und schreibe einen Blogbeitrag darüber.

Ich habe beschlossen, einige Funktionen hinzuzufügen, wie Stripe-Zahlungen (und LemonSqueezy-Zahlungen, wenn Sie sich keine Gedanken über Umsatzsteuer/Mehrwertsteuer machen möchten) sowie Zahlungsverwaltung, Authentifizierung, Verkehrsalarme und andere. Ich dachte auch, dass es konfigurierbar sein muss, wie zum Beispiel das Ersetzen von API Gateway und AWS Lambda durch ELB und ECS für längere Aufgaben.

Frontend

Ich habe zunächst das allgemein als einfachste Framework bezeichnete Framework ausgewählt. Es ist Vue und, soweit ich weiß, das zweitbeliebteste Framework auf dem Markt. Ich habe es ausgewählt, weil es nicht nur das einfachste ist, sondern weil ich auch etwas Erfahrung damit habe.

Die Website ist eine Standard-SPA-Anwendung mit Vite als Build-Tool. Für das Styling verwende ich Bootstrap, weil es auch sehr einfach zu handhaben ist und weil es bei der Migration von einer Version des Frontend-Frameworks auf eine andere keine großen Probleme verursacht.

Frontend-Hosting

Es gibt zwei Möglichkeiten:

  • S3 und CloudFront (CDN)
  • AWS Amplify Hosting, ein Wrapper für S3 und CloudFront, einfach zu verwenden, aber weniger konfigurierbar. Beispielsweise können Sie mit der CloudFront-Verteilung nichts machen, da sie nicht sichtbar ist. Sie können Ihre Anwendung auch nicht geografisch blockieren, außer durch Weiterleitungen.

Ich habe mich für Amplify Hosting als Hauptschwerpunkt von AWS bei Frontend-Hosting-Lösungen entschieden und weil es einfach einzurichten, eine Domain anzuhängen usw. ist.

Da es sich um eine Pay-as-you-go-Basis handelt, habe ich einen Verkehrsalarm eingerichtet: Wenn es mehr als eine bestimmte Anzahl von Treffern pro 10 Sekunden gibt, erhalte ich eine Benachrichtigung.

Backend

Das Backend ist das API Gateway, das die Ratenbegrenzung übernimmt, und AWS Lambda (Python), das die geschäftliche und allgemeine Logik übernimmt:

  • Prüfung, ob der Benutzer authentifiziert ist
  • Zahlungen abwickeln und Abonnements verwalten (Kundenportal)
  • E-Mails senden
  • usw.

Ich habe auch eine andere AWS Lambda-Funktion, die nach der Anmeldung in Cognito einen Benutzer in der Datenbank erstellt.

Es gibt gemeinsame Dienstprogramme, in denen ich einige gemeinsame Funktionen einbaue, zum Beispiel das Versenden von E-Mails. Außerdem Protokollierungsfunktionen, z. B. wird mir eine E-Mail gesendet, wenn ein Zahlungsfehler aufgetreten ist.

Authentifizierung

Die Authentifizierung ist mühsam, das weiß ich, und ich wollte keinen Drittanbieterdienst nutzen. Also blieb ich bei AWS Cognito. Es ist ziemlich günstig.

Sie können sagen, verwenden Sie einfach AWS Amplify Auth (ein Wrapper für AWS Cognito), aber ich hatte einige Probleme damit. Ich habe sogar einen Beitrag auf Reddit geschrieben:

Meine Liste der Probleme mit Amplify zur Authentifizierung

Und es gibt noch einen weiteren Beitrag mit einer noch größeren Liste von einem frustrierten Benutzer (es ist allerdings ein alter Beitrag).

Hier

Außerdem bleiben Sie, wenn Sie nur Amplify verwenden, im gesamten Ökosystem hängen und haben keine Chance, etwas zu ändern. Wenn Sie beispielsweise Zugriff auf die CloudFront-Distribution haben möchten (z. B. wenn Sie bestimmte Regionen geoblocken möchten), haben Sie Pech, dass Sie dies bei Amplify Hosting nicht sehen können. Ich hatte auch andere Probleme: Eines der Beispiele war die CDK-Erstellung aus Amplify-Ressourcen, was für mich ein Problem war.

Also habe ich einen hybriden Ansatz gewählt (der laut Reddit einigermaßen beliebt ist): Die AWS Amplify JS-Bibliothek ermöglicht es Ihnen, selbst erstellte Cloud-Ressourcen wie Benutzerpools zu importieren, also habe ich sie erstellt mit CDK und dann einfach die Amplify JS-Bibliothek zur Authentifizierung verwendet.

In diesem Fall kann ich jederzeit ändern, was ich möchte, Cloud-Ressourcen austauschen (ich könnte beispielsweise von Amplify Hosting zu CloudFront S3 wechseln, wenn ich Zugriff auf die CloudFront-Verteilung benötige).

E-Mails

AWS SES. Es ist der wichtigste E-Mail-Dienst von AWS. Es sendet alles, einschließlich Cognito-Authentifizierungs-E-Mails, Anfragen über das Kontaktformular usw. Das Einzige, was Sie verstehen müssen, ist, dass Sie in Ihrem AWS-Entwicklungskonto zunächst verifizierte Identitäten erstellen müssen, um senden zu können (ich habe es über automatisiert). IaC) und im Produktions-AWS-Konto müssen Sie Produktionszugriff anfordern (was nur ein paar Klicks dauert).

Mit AWS SES werden E-Mail-Benachrichtigungen in den folgenden Szenarien gesendet:

  • Wenn Zahlungsfehler auftreten.
  • Bei Spitzen im Web-Traffic.
  • Wenn der CI/CD-Rollout fehlschlägt.
  • Für andere Situationen, wie Authentifizierungs-E-Mails und Anfragen über das Kontaktformular usw.

Lagerung

DynamoDB als Datenbank. Einfach, schnell und verwaltet. Ja, ich musste über Zugriffsmuster nachdenken, aber im Allgemeinen ist es gut, damit zu arbeiten und es kostet mich auch nichts, während ich validiere/erstelle. Da ich vorhabe, an mehreren Produkten zu arbeiten und diese isoliert halten möchte, kann ich RDS/DocumentDB nicht pro Projekt in Entwicklungs- und Produktionskonten ablegen (das kostet viel zu viel).

Zahlungen

Ich habe zwei Zahlungssysteme hinzugefügt, und Sie können auswählen, welches Sie verwenden möchten, da sie ähnlich funktionieren:

  • Stripe ist beliebt und schlicht und einfach zu integrieren. Wenn ein Benutzer ein Produkt kauft, verwende ich Stripe Checkout und für die Verwaltung von Abonnements verwende ich das Stripe-Kundenportal.
  • LemonSqueezy ist Stripe sehr ähnlich, aber es ist auch ein Merchant of Record, was bedeutet, dass es die Umsatzsteuer/Mehrwertsteuer für Sie abwickelt. Es verfügt außerdem über einen Checkout für den Kauf eines Abonnements und ein Kundenportal für deren Verwaltung.

Es gibt Endpunkte, die ich für die Stripe/LemonSqueezy-Webhooks geschrieben habe, die die gesamte Logik verwalten.

Infrastruktur als Code

Es gibt also eine Menge Dinge zur Auswahl:

  • Etwas wie Terraform oder OpenTofu (vollständig Open-Source-Alternative, die auf Terraform basiert)
  • Pulumi
  • CDK
  • CloudFormation

Ich habe mich für AWS CDK entschieden, und hier sind meine Gründe:

  • Es ist einfach, damit zu arbeiten
  • Es ist beliebt und ausgereift genug
  • Meiner Meinung nach ist es viel besser als AWS CloudFormation
  • Es ist eine AWS-Bibliothek und ich verwende AWS
  • Ich kann es in Python, TypeScript oder anderen Sprachen schreiben. Da ich Python im Backend und TypeScript im Frontend verwende, ist es eine gute Wahl.

Der Grund, warum ich mich nicht für Terraform entschieden habe, ist, dass CDK einfacher ist; Zumindest meiner Meinung nach ermöglicht es die einfache Erstellung von Ressourcen. Ich mag OOP und versuche, meine Cloud-Infrastruktur entsprechend aufzubauen. Ein großer Vorteil ist, dass CI/CD enthalten ist (CDK-Pipelines), sodass ich das nicht erfinden muss.

CI/CD

Ich habe mich für CDK-Pipelines entschieden, weil es wiederum einfach ist. Verbinden Sie einfach die Pipeline mit dem GitHub-Repository und schon kann es losgehen. Git-Push in den Entwicklungszweig -> es wird auf das Entwicklungskonto ausgerollt. Git-Push zum Haupt- (oder Pull-Request) -> Produktions-Rollout.

Alarme und Ratengrenzen

Ich habe eine Ratenbegrenzung eingerichtet, um zu verhindern, dass Spam über das API-Gateway gesendet wird. Ich habe zwei CloudWatch-Alarme eingerichtet:

  • Um mich zu benachrichtigen, wenn die gehostete Website mit Anfragen zugespammt wird.
  • Um mich zu benachrichtigen, wenn das API-Gateway mit Anfragen zugespammt wird.

Ich habe außerdem Abrechnungsalarme eingerichtet, um mich zu informieren, wenn ich im Begriff bin, zu viel auszugeben.

Protokollierung

CloudWatch protokolliert die Ereignisse, Sie können sie sowohl in der AWS-Konsole als auch direkt in der IDE über Erweiterungen sehen.

KI

Die Wahl bestand zwischen der Verwendung von OpenAI (mit GPT-Modellen) oder AWS Bedrock (mit Claude-Modellen). Diese Entscheidung war eine Herausforderung, da sich AWS Bedrock mit Claude zwar problemlos in AWS integrieren lässt, OpenAI jedoch häufiger verwendet wird. Beide Unternehmen bieten erstklassige KI-Modelle an. Vorerst habe ich mich entschieden, bei AWS Bedrock zu bleiben. Das könnte sich in Zukunft ändern, aber im Moment schätze ich die Einfachheit. Für die Vektordatenbank verwende ich Pinecone, das über serverlose Indizes verfügt.

Ein Beispiel für die KI-Anwendung, die ich hier erstellt habe, ist ein RAG-System, bei dem es sich im Wesentlichen um einen Chatbot handelt, der Fragen basierend auf Ihren Daten beantworten kann. Sie speichern Informationen in einer Vektordatenbank, führen bei der Abfrage eine Ähnlichkeitssuche durch und verwenden dann einfach LLM, um eine Antwort basierend auf dem Ergebnis dieser Suche zu geben. Ich verwende derzeit einfache Modelle, um Kosten zu vermeiden, aber der Wechsel zu anderen Modellen ist so einfach wie das Ändern einer Codezeile.

Programmiersprachen

Ich war ursprünglich ein Java-Entwickler, wurde dann aber ein Python-Entwickler, weil ich maschinelles Lernen und Deep-Learning-Dienste entwickelte. Die meisten Bibliotheken in diesem Bereich werden in Python entwickelt oder verfügen über einen Python-Wrapper. Außerdem lässt sich Python nahtlos in AWS integrieren, sei es in AWS Lambda (z. B. mithilfe der AWS Lambda Powertools-Bibliothek) oder in CDK. Letztendlich werden also sowohl das Backend als auch die Cloud-Infrastruktur (über CDK) in Python implementiert.

Meine Sekundärsprache ist TypeScript aufgrund seiner Beliebtheit bei Frontend-Frameworks. Während ich früher mit JavaScript gearbeitet habe, empfand ich das Fehlen von Typen als verwirrend, als die Codebasis größer wurde. Die statische Typisierung von TypeScript sorgt für die dringend benötigte Klarheit und Sicherheit während der Entwicklung, insbesondere bei großen Projekten.

AWS-Rechnungen

Da ich keine hohe Verkehrslast habe, sind meine AWS-Kosten sehr niedrig, typischerweise 3–5 $ pro Monat, hauptsächlich aufgrund der CI/CD-Kosten.

Das Setup umfasst ein CDN (bereitgestellt von Amplify Hosting) und eine kleine Caching-Ebene innerhalb von AWS Lambda. Darüber hinaus fallen einige Dienste unter das AWS Free Kontingent, was meine Kosten weiter senkt.

Wenn das Produkt skaliert und mehr Benutzer gewinnt, muss ich möglicherweise die Ressourcen optimieren, indem ich auf bereitgestelltes DynamoDB umsteige und DAX (DynamoDB Accelerator) implementierte. Im Moment funktioniert dieses Setup jedoch einwandfrei.

Abschluss

Diese Lösung erfüllt meine aktuellen Anforderungen effizient.

Ich habe diesen gesamten Tech-Stack als Boilerplate (das ich aktiv entwickle und aktualisiere) in meine AWS-Vorlage auf SaaSConstruct eingefügt.

Ich werde weiterhin zusätzliche Funktionen untersuchen, die in dieses Setup integriert werden können, um seine Fähigkeiten zu verbessern ...

Freigabeerklärung Dieser Artikel wird unter: https://dev.to/server_kota/the-tech-stack-of-a-simple-saas-for-aws-kloud-4lhm?1 reproduziert.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3