Effizienz im großen Maßstab: Eine Geschichte der AWS-Kostenoptimierung
Veröffentlicht: 2022-07-22Ich habe kürzlich eine Analyseplattform für Kryptowährungen gestartet und erwarte eine kleine Anzahl von täglichen Benutzern. Als jedoch einige beliebte YouTuber die Seite hilfreich fanden und eine Bewertung veröffentlichten, wuchs der Datenverkehr so schnell, dass der Server überlastet wurde und die Plattform (Scalper.AI) nicht mehr zugänglich war. Meine ursprüngliche AWS EC2-Umgebung benötigte zusätzliche Unterstützung. Nachdem ich mehrere Lösungen in Betracht gezogen hatte, entschied ich mich, AWS Elastic Beanstalk zu verwenden, um meine Anwendung zu skalieren. Die Dinge sahen gut aus und liefen reibungslos, aber ich war verblüfft über die Kosten im Abrechnungs-Dashboard.
Dies ist kein ungewöhnliches Problem. Eine Umfrage aus dem Jahr 2021 ergab, dass 82 % der IT- und Cloud-Entscheidungsträger auf unnötige Cloud-Kosten gestoßen sind und 86 % nicht der Meinung sind, dass sie einen umfassenden Überblick über alle ihre Cloud-Ausgaben erhalten können. Obwohl Amazon in seiner Dokumentation einen detaillierten Überblick über zusätzliche Ausgaben bietet, ist das Preismodell für ein wachsendes Projekt komplex. Um die Dinge verständlicher zu machen, werde ich einige relevante Optimierungen aufschlüsseln, um Ihre Cloud-Kosten zu senken.
Warum ich mich für AWS entschieden habe
Das Ziel von Scalper.AI ist es, Informationen über Kryptowährungspaare (die beim Handel an einer Börse ausgetauschten Vermögenswerte) zu sammeln, statistische Analysen durchzuführen und Kryptohändlern Einblicke in die Marktlage zu geben. Der technische Aufbau der Plattform besteht aus drei Teilen:
- Skripte zur Datenaufnahme
- Ein Webserver
- Eine Datenbank
Die Aufnahmeskripte sammeln Daten aus verschiedenen Quellen und laden sie in die Datenbank. Ich hatte Erfahrung in der Arbeit mit AWS-Services, also entschied ich mich, diese Skripte durch die Einrichtung von EC2-Instances bereitzustellen. EC2 bietet viele Instance-Typen und lässt Sie Prozessor, Speicher, Netzwerk und Betriebssystem einer Instance auswählen.
Für die restliche Funktionalität habe ich mich für Elastic Beanstalk entschieden, weil es ein reibungsloses Anwendungsmanagement versprach. Der Load Balancer verteilte die Last ordnungsgemäß auf die Instanzen meines Servers, während die Autoscaling-Funktion das Hinzufügen neuer Instanzen für eine erhöhte Last handhabte. Das Bereitstellen von Updates wurde sehr einfach und dauerte nur wenige Minuten.
Scalper.AI funktionierte stabil und meine Benutzer hatten keine Ausfallzeiten mehr. Natürlich erwartete ich einen Anstieg der Ausgaben, da ich zusätzliche Dienste hinzufügte, aber die Zahlen waren viel größer als ich vorhergesagt hatte.
Wie ich die Cloud-Kosten hätte senken können
Rückblickend gab es viele komplexe Bereiche bei der Nutzung von AWS-Services in meinem Projekt. Wir werden die Budgetoptimierungen untersuchen, die ich bei der Arbeit mit gängigen AWS EC2-Funktionen entdeckt habe: Instanzen mit Spitzenleistung, ausgehende Datenübertragungen, elastische IP-Adressen sowie Beendigungs- und Stoppzustände.
Burstable-Performance-Instanzen
Meine erste Herausforderung bestand darin, den CPU-Energieverbrauch für mein wachsendes Projekt zu unterstützen. Die Datenerfassungsskripte von Scalper.AI bieten Benutzern eine Echtzeit-Informationsanalyse; Die Skripte laufen alle paar Sekunden und füttern die Plattform mit den neuesten Updates von Krypto-Börsen. Jede Iteration dieses Prozesses generiert Hunderte von asynchronen Jobs, sodass der erhöhte Datenverkehr der Site mehr CPU-Leistung erforderte, um die Verarbeitungszeit zu verkürzen.
Die günstigste von AWS angebotene Instanz mit vier vCPUs, a1.xlarge, hätte mich damals ~75 Dollar pro Monat gekostet. Stattdessen habe ich mich entschieden, die Last auf zwei t3.micro-Instanzen mit jeweils zwei vCPUs und 1 GB RAM zu verteilen. Die t3.micro-Instanzen boten genug Geschwindigkeit und Speicher für den Job, den ich brauchte, zu einem Fünftel der Kosten von a1.xlarge. Trotzdem war meine Rechnung am Ende des Monats immer noch größer als ich erwartet hatte.
Um zu verstehen, warum, habe ich die Dokumentation von Amazon durchsucht und die Antwort gefunden: Wenn die CPU-Auslastung einer Instanz unter eine definierte Baseline fällt, sammelt sie Credits, aber wenn die Instanz über die Baseline-Nutzung hinausgeht, verbraucht sie die zuvor verdienten Credits. Wenn keine Credits verfügbar sind, gibt die Instance von Amazon bereitgestellte „überschüssige Credits“ aus. Diese Möglichkeit, Credits zu verdienen und auszugeben, veranlasst Amazon EC2, die CPU-Auslastung einer Instance über 24 Stunden zu mitteln. Wenn die durchschnittliche Nutzung über die Basislinie hinausgeht, wird die Instanz zusätzlich pauschal pro vCPU-Stunde in Rechnung gestellt.
Ich habe die Datenaufnahmeinstanzen mehrere Tage lang überwacht und festgestellt, dass mein CPU-Setup, das die Kosten senken sollte, das Gegenteil bewirkte. Die meiste Zeit war meine durchschnittliche CPU-Auslastung höher als die Grundlinie.
Ich hatte zunächst die CPU-Auslastung für ein paar Krypto-Paare analysiert; Die Ladung war gering, also dachte ich, ich hätte viel Platz zum Wachsen. (Ich habe nur eine Mikroinstanz für die Datenaufnahme verwendet, da weniger Kryptopaare nicht so viel CPU-Leistung erforderten.) Ich erkannte jedoch die Grenzen meiner ursprünglichen Analyse, als ich mich entschied, meine Erkenntnisse umfassender zu machen und die Datenaufnahme zu unterstützen für Hunderte von Kryptopaaren – Cloud-Service-Analyse bedeutet nichts, wenn sie nicht im richtigen Maßstab durchgeführt wird.
Ausgehende Datenübertragungen
Ein weiteres Ergebnis der Erweiterung meiner Website waren erhöhte Datenübertragungen von meiner App aufgrund eines kleinen Fehlers. Da der Datenverkehr stetig zunahm und es keine Ausfallzeiten mehr gab, musste ich Funktionen hinzufügen, um die Aufmerksamkeit der Benutzer so schnell wie möglich zu erregen und zu halten. Mein neuestes Update war ein Audioalarm, der ausgelöst wurde, wenn die Marktbedingungen eines Krypto-Paares mit den vordefinierten Parametern des Benutzers übereinstimmten. Leider habe ich einen Fehler im Code gemacht, und Audiodateien wurden alle paar Sekunden hunderte Male in den Browser des Benutzers geladen.
Die Wirkung war enorm. Mein Fehler erzeugte Audio-Downloads von meinen Webservern, was zusätzliche ausgehende Datenübertragungen verursachte. Ein winziger Fehler in meinem Code führte zu einer fast fünfmal höheren Rechnung als die vorherigen. (Dies war nicht die einzige Folge: Der Fehler konnte ein Speicherleck im Computer des Benutzers verursachen, so dass viele Benutzer nicht mehr zurückkamen.)
Die Kosten für die Datenübertragung können bis zu 30 % der AWS-Preissteigerungen ausmachen. Die eingehende EC2-Übertragung ist kostenlos, aber die Gebühren für die ausgehende Übertragung werden pro GB abgerechnet (0,09 USD pro GB, als ich Scalper.AI erstellte). Wie ich auf die harte Tour gelernt habe, ist es wichtig, mit Code vorsichtig zu sein, der ausgehende Daten beeinflusst. Das Reduzieren von Downloads oder Laden von Dateien, wo möglich (oder die sorgfältige Überwachung dieser Bereiche), schützt Sie vor höheren Gebühren. Diese Pfennige summieren sich schnell, da die Gebühren für die Übertragung von Daten von EC2 ins Internet von der Arbeitslast und den AWS-regionsspezifischen Tarifen abhängen. Ein letzter Vorbehalt, der vielen neuen AWS-Kunden unbekannt ist: Die Datenübertragung zwischen verschiedenen Standorten wird teurer. Die Verwendung privater IP-Adressen kann jedoch zusätzliche Kosten für die Datenübertragung zwischen verschiedenen Verfügbarkeitszonen derselben Region vermeiden.
Elastische IP-Adressen
Auch bei Verwendung öffentlicher Adressen wie Elastic IP-Adressen (EIPs) ist es möglich, Ihre EC2-Kosten zu senken. EIPs sind statische IPv4-Adressen, die für dynamisches Cloud-Computing verwendet werden. Der „elastische“ Teil bedeutet, dass Sie jeder EC2-Instance ein EIP zuweisen und es verwenden können, bis Sie sich entscheiden, es zu beenden. Mit diesen Adressen können Sie fehlerhafte Instanzen nahtlos durch fehlerfreie ersetzen, indem Sie die Adresse einer anderen Instanz in Ihrem Konto neu zuordnen. Sie können EIPs auch verwenden, um einen DNS-Eintrag für eine Domäne anzugeben, sodass er auf eine EC2-Instance verweist.
AWS bietet nur fünf EIPs pro Konto und Region, was sie zu einer begrenzten Ressource macht und bei ineffizienter Nutzung kostspielig ist. AWS berechnet einen niedrigen Stundensatz für jeden zusätzlichen EIP und stellt zusätzliche Rechnungen, wenn Sie einen EIP mehr als 100 Mal in einem Monat neu zuordnen; Wenn Sie diese Grenzen unterschreiten, werden die Kosten gesenkt.
Zustände beenden und stoppen
AWS bietet zwei Optionen zum Verwalten des Status laufender EC2-Instances: Beenden oder Anhalten. Durch das Beenden wird die Instanz heruntergefahren und die dafür bereitgestellte virtuelle Maschine ist nicht mehr verfügbar. Alle angehängten Elastic Block Store (EBS)-Volumes werden getrennt und gelöscht, und alle lokal in der Instanz gespeicherten Daten gehen verloren. Die Instanz wird Ihnen nicht mehr in Rechnung gestellt.
Das Stoppen einer Instanz ist ähnlich, mit einem kleinen Unterschied. Die angehängten EBS-Volumes werden nicht gelöscht, sodass ihre Daten erhalten bleiben und Sie die Instanz jederzeit neu starten können. In beiden Fällen berechnet Amazon keine Gebühren mehr für die Nutzung der Instanz, aber wenn Sie sich für das Stoppen statt für das Beenden entscheiden, verursachen die EBS-Volumes Kosten, solange sie vorhanden sind. AWS empfiehlt, eine Instance nur dann zu stoppen, wenn Sie davon ausgehen, dass sie bald reaktiviert wird.
Aber es gibt eine Funktion, die Ihre AWS-Rechnung am Ende des Monats erhöhen kann, selbst wenn Sie eine Instanz beendet haben, anstatt sie zu stoppen: EBS-Snapshots. Dies sind inkrementelle Sicherungen Ihrer EBS-Volumes, die im Simple Storage Service (S3) von Amazon gespeichert sind. Jeder Snapshot enthält die Informationen, die Sie zum Erstellen eines neuen EBS-Volumes mit Ihren vorherigen Daten benötigen. Wenn Sie eine Instance beenden, werden die zugehörigen EBS-Volumes automatisch gelöscht, aber ihre Snapshots bleiben erhalten. Da S3 nach dem gespeicherten Datenvolumen berechnet wird, empfehle ich Ihnen, diese Snapshots zu löschen, wenn Sie sie in Kürze nicht verwenden. AWS bietet die Möglichkeit, die Speicheraktivität pro Volume mit dem CloudWatch-Service zu überwachen:
- Suchen und öffnen Sie, während Sie bei der AWS-Konsole angemeldet sind, im Dienstemenü oben links den CloudWatch -Dienst.
- Klicken Sie links auf der Seite unter dem reduzierbaren Menü Metriken auf Alle Metriken .
- Die Seite zeigt eine Liste der Dienste mit verfügbaren Metriken, einschließlich EBS, EC2, S3 und mehr. Klicken Sie auf EBS und dann auf Pro-Volume-Metriken . (Hinweis: Die EBS- Option ist nur sichtbar, wenn Sie EBS-Volumes in Ihrem Konto konfiguriert haben.)
- Klicken Sie auf die Registerkarte Abfrage . Kopieren Sie in der Ansicht Editor den Befehl
SELECT AVG(VolumeReadBytes) FROM "AWS/EBS" GROUP BY VolumeId
und fügen Sie ihn ein und klicken Sie dann auf Ausführen . (Hinweis: CloudWatch verwendet einen SQL-Dialekt mit einer eindeutigen Syntax.)
CloudWatch bietet eine Vielzahl von Visualisierungsformaten zur Analyse der Speicheraktivität, wie Tortendiagramme, Linien, Balken, gestapelte Flächendiagramme und Zahlen. Die Verwendung von CloudWatch zur Identifizierung inaktiver EBS-Volumes und Snapshots ist ein einfacher Schritt zur Optimierung der Cloud-Kosten.
Zusätzliches Geld in Ihrer Tasche
Obwohl AWS-Tools wie CloudWatch anständige Lösungen für die Cloud-Kostenüberwachung bieten, lassen sich verschiedene externe Plattformen für eine umfassendere Analyse in AWS integrieren. Beispielsweise zeigen Cloud-Management-Plattformen wie CloudHealth von VMWare eine detaillierte Aufschlüsselung der Bereiche mit den höchsten Ausgaben, die für Trendanalysen, Anomalieerkennung und Kosten- und Leistungsüberwachung verwendet werden können. Ich empfehle außerdem, dass Sie einen CloudWatch-Abrechnungsalarm einrichten, um Gebührenspitzen zu erkennen, bevor sie übermäßig werden.
Amazon bietet viele großartige Cloud-Services, die Ihnen helfen können, die Wartungsarbeiten von Servern, Datenbanken und Hardware an das AWS-Team zu delegieren. Obwohl die Kosten für Cloud-Plattformen aufgrund von Fehlern oder Benutzerfehlern leicht steigen können, geben AWS-Überwachungstools Entwicklern das Wissen an die Hand, um sich vor zusätzlichen Kosten zu schützen.
Mit diesen Kostenoptimierungen im Hinterkopf sind Sie bereit, Ihr Projekt auf den Weg zu bringen – und dabei Hunderte von Dollar zu sparen.