Die Erstellung moderner Anwendungen mit Serverless-Technologie und Managed Services bedeutet, dass jeder verteilte und hochverfügbare Systeme erstellen kann, ohne sich um die zugrunde liegende Infrastruktur kümmern zu müssen. Aber es geht nicht nur um Spaß und Spiel. Dieser Vortrag mit dem Titel „Performing chaos engineering in a serverless world“, den ich auf der AWS re:Invent 2019 gehalten habe, erläutert einige der Herausforderungen von Serverless, häufige Schwachstellen in Serverless-Anwendungen sowie Herausforderungen bei der Verwendung von Chaos Engineering in Serverless. Bitte sehen Sie sich das Video an.
Versagen in unsere Funktionen einbauen
AWS Serverless Hero Yan Cui hat mehrere Artikel über Latenz-Injektion für AWS Lambda geschrieben, siehe „Wie können wir die Prinzipien des Chaos Engineering auf AWS Lambda anwenden?“ (https://theburningmonk.com/2017/10/how-can-we-apply-the-principles-of-chaos-engineering-to-aws-lambda/) und „Applying principles of chaos engineering to AWS Lambda with latency injection“ (https://hackernoon.com/chaos-engineering-and-aws-lambda-latency-injection-ddeb4ff8d983) vom Oktober 2017. In diesen Artikeln wird erklärt, warum wir Chaos Engineering in unseren serverlosen Anwendungen einsetzen können und sollten, und es werden Beispiele gezeigt, wie wir es tun können.
Adrian Hornsby, AWS Principal Developer Advocate Architecture, hat dies weiter ausgebaut, indem er zunächst eine Lambda-Schicht und später eine Python-Bibliothek für die Fehlerinjektion, chaos_lambda (https://github.com/adhorn/aws-lambda-chaos-injection), erstellt hat, die Entwicklern einen einfacheren Einstieg in Chaos-Experimente für AWS Lambda ermöglicht. Installieren Sie einfach die Bibliothek, umhüllen Sie Ihre Funktionen mit dem entsprechenden Fehlermodus und schon können Sie mit der Fehlerinjektion beginnen!
Um das gleiche Maß an Einfachheit für NodeJS-Entwickler zu erreichen, habe ich Ende letzten Jahres ein NPM-Paket namens failure-lambda (https://github.com/gunnargrosch/failure-lambda) erstellt. Das Ziel von failure-lambda ist, kurz gesagt, eine einfache Möglichkeit zur Fehlerinjektion in AWS Lambda unter Verwendung mehrerer verschiedener Fehlermodi. Um es noch einfacher zu machen, habe ich beschlossen, einen einzigen Wrapper zu verwenden und stattdessen den Fehlermodus auswählbar zu machen. Auf diese Weise müssen Sie keine Änderungen am Code vornehmen, wenn Sie z.B. zwischen Latenz oder Exception Injection wechseln möchten, sondern Sie ändern einfach eine Einstellung.
Wie wir wissen, geht es bei Serverless nicht nur um AWS und beim Chaos-Engineering für Serverless geht es nicht nur um AWS Lambda. Aus diesem Grund gibt es jetzt auch die gleichen Optionen für NodeJS-Entwickler, die Serverless mit Azure Functions und Cloud Functions erstellen. Dies mit den NPM-Paketen failure-azurefunctions (https://github.com/gunnargrosch/failure-azurefunctions) und failure-cloudfunctions (https://github.com/gunnargrosch/failure-cloudfunctions).
Ausfallarten und Ausfallrate
Auch wenn alles mit der Latenz-Injektion in den Artikeln von Yan Cui begann, ist die Latenz bei weitem nicht der einzige mögliche Fehler, den wir in unseren serverlosen Anwendungen haben können. In failure-lambda, failure-azurefunctions und failure-cloudfunctions stehen jetzt fünf verschiedene Fehlermodi zur Auswahl:
Latenz – Fügt der ausgeführten Funktion eine Latenz hinzu, die über eine minimale und maximale Spanne von Millisekunden gesteuert wird. Damit können Sie zum Beispiel die Latenzzeit eines Dienstes simulieren oder Ihre Timeout-Werte testen und festlegen.
Exception – Wirft eine Exception in der Funktion. Hilft Ihnen zu testen, wie Ihre Anwendung und Ihr Code mit Ausnahmen umgehen.
Statuscode – Ihre Funktion gibt einen Statuscode Ihrer Wahl zurück, z.B. 502 oder 404 anstelle des normalen 200. Dies gibt Ihnen die Möglichkeit zu testen, was bei Fehlern passiert.
Speicherplatz – Füllt Ihre temporäre Festplatte mit Dateien, um einen Fehler zu erzeugen. Wenn Sie eine Festplatte zum Speichern temporärer Dateien verwenden, können Sie testen, wie sich Ihre Anwendung verhält, wenn diese Festplatte voll ist oder Sie nicht mehr darauf speichern können.
Blacklist (mit freundlicher Genehmigung von Jason Barto) – Blockiert Verbindungen zu bestimmten Hosts. Verwenden Sie diese Funktion, um die Nichtverfügbarkeit von Diensten oder Dritten zu simulieren.
Alle diese Ausfallmodi können zusammen mit einer von Ihnen festgelegten Ausfallrate verwendet werden. Die Standardeinstellung ist, bei jedem Aufruf einen Fehler einzubauen, aber in der Realität ist es wahrscheinlich, dass z.B. ein Dritter bei 50% der Aufrufe dieses Hosts nicht verfügbar ist oder dass bei einem Viertel der Aufrufe eine Ausnahme ausgelöst wird. Mit der Einstellung der Rate können Sie dies erreichen.