Suchen

Runtime und Docker Images als Lambda-Layer Eigene Laufzeitumgebungen in AWS Lambda

| Autor / Redakteur: Sascha Möllering * / Stephan Augsten

„Wir haben eine Anwendung mit Hilfe von Elixir implementiert und würden diese gerne in AWS Lambda laufen lassen. Welche Möglichkeiten existieren für die Erstellung eigener Laufzeitumgebungen in AWS Lambda?“

Firmen zum Thema

Gemeinsam genutzter Code lässt sich in eine ZIP-Datei packen und als Lambda-Layer hochladen.
Gemeinsam genutzter Code lässt sich in eine ZIP-Datei packen und als Lambda-Layer hochladen.
(Bild: AWS Germany GmbH)

Mit AWS Lambda kann Code ausgeführt werden, ohne Server bereitstellen und verwalten zu müssen. Da man lediglich für die angefallene Rechenzeit bezahlen muss, entstehen auch keine Kosten, wenn der Code nicht ausgeführt wird. Mit Lambda kann Code für fast jede Anwendungsart oder jeden Backend-Service ausgeführt werden, und zwar ohne Administration.

AWS Lambda Layer

Beim Erstellen von serverlosen Anwendungen ist es durchaus üblich, dass Code vorhanden ist, der von verschiedenen Lambda-Funktionen gemeinsam genutzt wird. Typische Beispiele sind Agenten, die Metrikdaten aufnehmen, oder Logging-Funktionalitäten.

Bisher musste man diesen gemeinsamen Code zusammen mit allen Funktionen, die ihn verwenden, paketieren und bereitstellen. Mittlerweile lassen sich gängige Komponenten aber in eine ZIP-Datei packen und als Lambda-Layer hochladen. Layer können versioniert werden, um Aktualisierungen zu verwalten, jede Version ist dabei unveränderlich.

In der Konfiguration einer Funktion ist es möglich, auf bis zu fünf Schichten zu verweisen, von denen eine optional eine Laufzeit sein kann. Wenn die Funktion aufgerufen wird, werden die Layer in '/opt' in der angegebenen Reihenfolge installiert. Die Reihenfolge ist wichtig, da alle Schichten unter dem gleichen Pfad extrahiert werden, so dass jede Schicht die vorherige möglicherweise überschreiben kann.

Dieser Ansatz stellt eine recht einfache Möglichkeit dar, die Umgebung anzupassen. Beispielsweise könnte die erste Schicht als Laufzeit dienen und die zweite Schicht fügt spezifische Versionen der benötigten Bibliotheken hinzu.

AWS Custom Runtimes

Die Runtime-API für AWS Lambda definiert eine standardisierte HTTP-basierte Spezifikation, die festlegt, wie Lambda und die Runtime einer Funktion kommunizieren. Dies ermöglicht, benutzerdefinierte Laufzeiten zu erstellen, die in Lambda integriert sind, um Funktionen als Reaktion auf Ereignisse auszuführen.

Durch die Nutzung der Runtime-API können Binaries oder Shell-Skripte verwendet werden. Gleiches gilt für beliebige Sprachen und Sprachversionen. Eine bei GitHub bereitgestellte Beispiel-Implementierung zeigt eine exemplarische Runtime, mit der Elixir-basierte Anwendungen auf AWS Lambda laufen.

Docker Images als AWS Lambda Layer

Docker Images sind im Prinzip nur ein Paketierungsformat. Somit lassen sich alle notwendigen Dateien recht einfach aus dem Image extrahieren und in anderer Form weiterverwerten. Für diese Repaketierung kann man sich dabei die Funktionalität der Lambda Layer zu Nutze machen, um die Docker Images als Lambda-Funktionen wiederverwenden zu können.

Das Konvertierungstool img2lambda nutzt als Basis Docker-Images, verpackt sie in AWS Lambda Layer und publiziert diese als neue Layer-Versionen nach AWS Lambda. Dieses Tool kopiert alle Dateien unter '/opt' aus dem Docker Image, wobei die individuellen Docker Image-Layer als Lamba Layer erhalten bleiben.

Die dabei publizierten Amazon Resource Names (ARNs) werden in der Datei 'output/layers.json' gespeichert, die als Input bei der Erstellung der Lambda-Funktion genutzt werden kann. Folgendes Beispiel zeigt die Nutzung des Tools img2lambda:

cd example
docker build -t lambda-php .
./bin/local/img2lambda -i lambda-php:latest -r us-east-1

In diesem Beispiel wird ein Docker Image für eine PHP-Anwendung gebaut, mit Hilfe von img2lamba werden die entsprechen Lambda Layer erzeugt und publiziert, die die PHP Laufzeitumgebung enthalten.

Fazit

Sascha Möllering
Sascha Möllering
(Bild: AWS Germany GmbH)

Mit AWS Lambda Layers und AWS Custom Runtimes existieren zwei Funktionalitäten, die es Entwicklern ermöglichen, eigene Runtimes für Lambda zu erstellen und Code zu nutzen, der von verschiedenen Lambda-Funktionen verwendet wird.

* Sascha Möllering arbeitet als Solutions Architect bei der Amazon Web Services Germany GmbH. Seine Interessen liegen in den Bereichen Automation, Infrastructure as Code, Distributed Computing, Container und JVM.

(ID:45767018)