© Excellent backgrounds/Shutterstock.com
Bildergalerie mit AWS Lambda und API Gateway

Serverless by Example


Serverless verspricht, dass man als Entwickler keine Server verwalten muss, um kleine und auch größere Applikationen zum Laufen zu bringen. Welche Voraussetzungen eine Anwendung erfüllen muss, um die Möglichkeiten von Serverless wirklich ausschöpfen zu können, zeigt das Beispiel einer Bildergalerie mit Uploadfunktion.

Serverless-Technologien werden von allen großen Cloud-Anbietern bereitgestellt. Den Anfang hat hier Amazon mit Lambda (2014) und wenig später API Gateway (2015) gemacht, darauf sind Microsoft mit Azure Functions und Google mit Cloud Functions nachgezogen. Alle drei unterscheiden sich nur in wenigen Details voneinander. Ein wesentlicher Unterschied ist jedoch, dass Microsoft und Google ihre Angebote noch mit einem Label wie Alpha oder Vorschau versehen. AWS hingegen stellt mit Lambda und API Gateway Dienste bereit, die seit Mitte 2015 für den Produktivbetrieb geeignet und bewährt sind. Deshalb nutzen wir für dieses Beispiel das Angebot von AWS. Weiter bietet Lambda eine tiefe Integration in andere AWS-Dienste und somit viele Möglichkeiten für Serverless-Lösungen sowie ein attraktives Preismodell [1]. Gerade für kleine Anwendungen und Prototypen eignet sich Lambda aufgrund des Abrechnungsmodells und des großzügigen Free Tiers. Bewegt man sich sowieso schon in der AWS Cloud, fällt die Wahl leicht, da so eine Integration in bestehende Anwendungen leichtfällt.

Oft beschränken sich Beispiele für Serverless-Anwendungsfällen auf kleine Teile einer Anwendung, ohne den Kontext einer größeren Anwendung zu berücksichtigen, obwohl gerade bei Serverless-Anwendungen entgegen der Erwartungen relativ viele Komponenten beteiligt sind. Außerdem werden die Server gegen dutzende Konfigurationsparameter eingetauscht. Eine Bildergalerie soll deswegen als komplexeres Beispiel dienen. Dort können Bilder hochgeladen werden. Daraufhin extrahiert die Anwendung Metadaten aus den gesammelten Daten und generiert einen Fotostream.

Serverless-Applikationen verzichten auf eigene Server. Sie fokussieren sich auf externe Dienste, die über APIs verfügbar sind. In unserem Fall sind das mehrere Dienste von AWS. Die Datenhaltung für die Bilder und Metadaten geschieht in Amazon S3 und in DynamoDB. Die Logik findet in Lambda einen Platz, und mit API Gateway wird aus den sonst nur über AWS-APIs aufrufbaren Lambda-Funktionen ein über das Internet verfügbares API. In unserem Beispiel wollen wir uns auf die Umsetzung und Verdrahtung der serverseitigen Dienste konzentrieren. Den Client sparen wir uns und testen per Hand.

mohrhard_serverless_1.tif_fmt1.jpgAbb. 1: Architektur der Serverless-Bildergalerie: Die Datenhaltung für die Bilder und Metadaten in Amazon S3 und DynamoDB, die Logik in Lambda; mit API Gateway wird aus den sonst nur über AWS-APIs aufrufbaren Lambda-Funktionen ein über das Internet verfügbares API

Technisch gesehen werden über eine noch zu entwickelnde App Bilder auf Amazon S3 hochgeladen. Dabei wird ein Ereignis erzeugt und eine Lambda-Funktion [2] untersucht das Bild nach relevanten Metadaten, beispielsweise das Aufnahmedatum oder Geodaten. Diese Daten werden dann in der Amazon-NoSQL-Datenbank DynamoDB [3] abgelegt. Eine zweite Lambda-Funktion generiert passend zu den Daten in der Persistenz einen Feed, der alle aktuellen Fotos und Metadaten enthält. Aus dem Web erreichbar wird dieser Feed durch die Konfiguration von API Gateway [4], das unter anderem Endpunkte für Lambda-Funktionen zur Verfügung stellt.

Interagiert wird mit der Applikation über zwei Mechanismen. Zum einen werden durch das Hochladen von Bildern auf S3 Ereignisse generiert, die von Lambda-Funktionen verarbeitet werden. Zum anderen wird eine Folge von Anfragen an das öffentliche API Lambdas durch API Gateway synchron aufgerufen. Damit dies funktioniert, müssen sowohl die eventbasierten als auch die synchronen Aufrufe durch API Gateway konfiguriert werden.

Um all das zu verdrahten, nutzen wir die AWS ­Console, die eine einheitliche und übersichtliche Oberfläche für alle Lambda-Funktionen und APIs bietet. Dort sehen wir auch, welche Funktionen Lambda und API Gateway liefern und welche Einstellungen dafür nötig sind. Natürlich lassen sich alle gezeigten Funktionen auch über das API und bis auf ganz wenige Ausnahmen über die Infrastrukturautomatisierung CloudForma­tion [5] konfigurieren. Obwohl der Weg über die Konsole komfortabel ist, sollte man für größere Vorhaben dringend eine automatisierte Lösung bevorzugen.

Code mit Lambda ausführen

AWS Lambda unterstützt die Ausführung von speziell dafür entwickelten so genannten Handlern in der Cloud. Momentan stehen dafür Umgebungen für JVM-basierte Sprachen auf Basis von Java 8 sowie Python 2.7 und Node.js 4.3 zur Verfügung. Abgerechnet wird auf Basis der gewählten Größe des Arbeitsspeichers – in Abhängigkeit davon wird CPU-Zeit zugeteilt – und der Ausführungsdauer in 100-Millisekunden-Inkrementen. Über Umwege durch eine der genannten Sprachen ist es auch möglich, beliebige Binaries auszuführen. So lässt sich unter anderem Go nutzen. Für unsere Applikation benötigen wir zwei Handler, einen, der ein gerade hochgeladenes Bild verarbeitet, und einen, der Daten aus DynamoDB holt und sie für den Client aufbereitet ...

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