© Excellent backgrounds/Shutterstock.com
Serverlose Microservices mit AWS Lambda

Darfs auch etwas weniger sein?


Die Infrastruktur unter Containern und Clustern zu managen, kann ganz schön anstrengend sein. Amazon Lambda enthebt uns dieser lästigen Aufgabe. Mit Lambda können wir Code in einer von AWS vollständig gemanagten Infrastruktur deployen und ausführen. Um die Server müssen wir uns nicht mehr kümmern.

Langsam aber sicher haben wir uns an Microservices, Bounded Contexts, funktionale Dekomposition und Self-contained-Systems gewöhnt. Wir deployen unsere Anwendungen nicht mehr als Monolithen auf einem dicken Application Server, sondern bauen und starten für jedes Deployment einen Container und lassen diesen in einem Cluster laufen. Durch den DevOps-Ansatz sind die Grenzen zwischen Entwicklung und Betrieb fließend geworden, und bestenfalls managt jedes Team seine eigenen Services ganzheitlich. Soweit zur Best-Case-Theorie.

Mit der Zeit wird das aber recht anstrengend, für jeden kleinen Service einen eigenen Container zu erzeugen und diese entsprechend redundant in einem Containercluster in Betrieb zu nehmen. Nicht die Sache selbst, aber das Management wird komplexer. Um die Übersicht zu behalten, muss immer mehr Aufwand betrieben werden. Denn die Anzahl an laufenden Instanzen wird immer höher, je mehr wir uns daran gewöhnen, immer kleinere Einheiten (Microservices) zu entwickeln und zu betreiben. Letztendlich wollen wir eigentlich nur Code schreiben und ihn irgendwo ausführen. Egal wo, Hauptsache er läuft; zuverlässig und skalierbar, bestenfalls automatisiert. Durch das Verlagern von Komplexität in den Betrieb der Anwendungen befassen wir Entwickler uns mehr mit dem Betrieb, als wir manchmal eigentlich möchten. Nicht falsch verstehen, DevOps und das ganzheitliche Betrachten von Anwendungen ist mehr als richtig. Aber manchmal erscheint uns der Aufwand doch immens hoch zu dem, was wir eigentlich bewerkstelligen wollen. Geht das nicht auch einfacher? So wie anonyme Klassen oder Funktionen mitten in einem Programmcode existieren, könnte doch auch ein Service einfach so, ohne großen sichtbaren Aufwand in einer Infrastruktur leben. Auch Werner Vogels, CTO von Amazon, sagte auf der re:invent 2015 in Las Vegas: „Kein Server ist einfacher zu managen als kein Server.“

Der nächste Schritt: serverlos

Genau hier kommt AWS Lambda [1] ins Spiel. Lambda erlaubt es uns, einfach nur Code in eine von AWS bereitgestellte und vollständig gemanagte Infrastruktur zu deployen und ihn auszuführen, ohne uns um die Server kümmern zu müssen. Werden mehr Ressourcen benötigt, skaliert AWS die Umgebung automatisch, sodass allen Lambda-Nutzern ausreichend Ressourcen zur Verfügung stehen. Lambda-Funktionen werden ereignisgesteuert ausgelöst, d. h. durch Events von anderen AWS-Services oder durch Aufrufe über das API-Gateway. Zahlen müssen wir nur die Zeit, die für die Ausführung unseres Codes aufgewendet wird. Es fallen also keine Kosten für Leerlaufzeiten an.

Von außen betrachtet stellt AWS mit Lambda und weiteren Services, die ich im Laufe des Artikels noch genauer beschreibe, eine serverlose Infrastruktur bereit, da wir, die Nutzer, nicht mehr dedizierte Server nutzen, sondern nur noch einzelne Services. Der Serviceanbieter, in diesem Fall Amazon Web Services, sorgt für die entsprechende Isolierung der Umgebungen gegenüber anderen Nutzern, Verfügbarkeit und Skalierung der Systeme. Auch wenn es serverlos heißt, werden dennoch Server im Hintergrund betrieben. Wir kommen nur nicht mehr direkt mit ihnen in Berührung und müssen uns somit auch keine Gedanken mehr um deren Betrieb machen. Das vereinfacht viele Dinge und senkt direkt damit verbundene Kosten.

So funktioniert Lambda

Schauen wir uns den Lambda-Service etwas genauer an: Lambda erlaubt die Ausführung von verschiedenen Programmiersprachen: JVM-basierte Sprachen, JavaScript (Node.js Runtime) und Python. Die Script-basierten Funktionen können direkt in einer Webkonsole programmiert werden (Abb. 1) oder, wie auch die JVM-basierten Programme, als ZIP-Datei hochgeladen oder in einem S3 Bucket bereitgestellt werden. Die JVM-basierten Bina­ries werden als Fat JAR gepackt und enthalten somit alle zur Laufzeit benötigten Bibliotheken. In der Laufzeitumgebung müssen keine Abhängigkeiten mehr installiert werden. Da der Binary-Code ausgeführt wird, ist nicht nur Java, sondern auch jede andere JVM-basierte Sprache (z. B. Groovy oder Scala) möglich.

koebler_lambda_1.tif_fmt1.jpgAbb. 1: AWS-Lambda-Webkonsole mit Node.js-Editor

Wie sehr Lambda das Erstellen von Funktionen vereinfacht, zeigt Listing 1, in dem die einfachste Variante, eine Lambda-Funktion zu implementieren, mit JavaScript dargestellt ist. Selbst in einem regulären Node.js-Programm wären noch etwa zehn bis zwanzig Zeilen Code mehr notwendig, um die Funktion sinnvoll ausführen zu können. Aber all dieser Overhead, der in jedem Anwendungsfall identisch ist, nimmt uns Lambda ab und stellt somit eine sehr auf die Ausführung von Programmcod...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang