Blog

Erstellen einer Elixir-Laufzeit für AWS Lambda

Arjan Molenaar

Aktualisiert Oktober 21, 2025
3 Minuten

Auf der letzten AWS Re:invent kündigte Amazon die Unterstützung für benutzerdefinierte Laufzeiten auf AWS Lambda an. AWS bietet Unterstützung für eine ganze Reihe von Sprachen, die bereits im Lieferumfang enthalten sind. NodeJS ist die schnellste, aber nicht immer die am besten lesbare Sprache. Python können Sie von der AWS-Konsole aus bearbeiten, während Sie für Java, C# und Go Binärdateien hochladen müssen. Seltsam ist meiner Meinung nach, dass in der Liste der unterstützten Sprachen keine funktionalen Sprachen enthalten sind1. Obwohl der Name des Dienstes etwas im Bereich der funktionalen Programmierung vermuten ließe. Die Funktionsweise einer Funktion selbst ist auch ziemlich einfach: ein Eingabeereignis wird verarbeitet und ein Ausgabeereignis wird zurückgegeben(emittiert, wenn Sie so wollen).Daher schien es ein logischer Schritt, eine Laufzeit für eine funktionale Programmiersprache zu implementieren. Die Sprache meiner Wahl ist Elixir, eine sehr gut lesbare funktionale Programmiersprache, die auf BEAM, der Erlang VM, läuft.

Erstellen einer Laufzeitumgebung

Der Prozess der Erstellung einer Laufzeitumgebung ist in der AWS-Dokumentation ziemlich gut erklärt. In meinem Fall habe ich ein wenig Erfahrung gesammelt, indem ich das bash-basierte Laufzeitbeispiel implementiert habe. Dies ist eine gute Grundlage für jede benutzerdefinierte Laufzeitumgebung. Eine Runtime wird durch ein Skript namens "bootstrap" gestartet. Wenn Sie bereits ein Bash-basiertes Startskript haben, können Sie ein wenig testen, während Sie die Runtime einrichten.Die Runtime selbst sollte als Zip-Datei gebündelt werden. Eine einfache Möglichkeit, eine solche Zip-Datei zu erstellen - insbesondere, wenn Binärdateien beteiligt sind - ist das Lambda-Basis-Image aus dem LambCI-Projekt.Um die Zip-Datei nicht zu groß zu machen, musste ich sie erheblich verkleinern. Die kombinierten Schichten, einschließlich der Laufzeit, sollten nicht größer als 65 MB sein. Viele Tools wie Observer (Überwachung), Mnesia (Datenbank), Terminal und GUI-bezogener Code können alle weggelassen werden. Ich konnte die Größe auf anständige 23 MB reduzieren. Der defacto Weg, eine Erlang-Anwendung zu verteilen, ist ein OTP-Release. Dies bündelt den Code und den BEAM in einem einzigen Paket. Für Lambda möchte ich dies schlanker gestalten: Sie müssen nur Ihren kompilierten Code bereitstellen und das sollte alles sein. Dadurch wird die Bereitstellung schneller, da weniger Bytes verschoben werden müssen und die Anwendung in der Laufzeitschicht verbleiben kann.

elixir-lambda-blog.md#benchmarksBenchmarks

Wir alle wollen, dass es schnell ist. Ich habe keinen ausführlichen Leistungstest durchgeführt. Für eine Hello-world-Funktion, die ich eingesetzt habe, waren die Antworten ganz in Ordnung. Bis zu zwanzig ms und oft sogar nur ein paar Millisekunden. Die Kaltstartgeschwindigkeit beträgt laut AWS X-Ray etwa 1,3 Sekunden. Das ist ziemlich konstant. Ich möchte sehen, ob ich das verringern kann. An diesem Punkt steht das Erlang-Vermächtnis der Verwendung als Lambda-Sprache im Weg: Das Erlang/OTP-Ökosystem ist auf Anwendungen aufgebaut, die nie ausfallen, wie z.B. Telefonschalter. Bei Lambda haben wir die Gewissheit, dass dies nie ein langlebiger Prozess sein wird. Die Kaltstartzeiten sind allerdings immer noch mit Java kompatibel.

Abschließende Gedanken

Das Lambda-Modell ist sehr einfach. Es ist gut zu sehen, dass die Verwendung von benutzerdefinierten Laufzeiten keine (ernsthaften) Leistungseinbußen mit sich bringt. Mit den oben beschriebenen Tools ist es recht einfach, Unterstützung für eine Sprache hinzuzufügen, die heute nicht in AWS Lambda enthalten ist. Sie werden auf den Webeditor verzichten müssen, was ich aber nicht als großen Verlust empfinde, da ich meinen Code ohnehin in Git ablege. Werfen Sie einen Blick auf das Elixir Lambda Repository und probieren Sie es aus. Ich habe der Einfachheit halber Cloudformation-Vorlagen und ein Makefile hinzugefügt. Lassen Sie mich wissen, was Sie davon halten! [1] Nun, Sie könnten F#-Code mit der .Net-Laufzeitumgebung ausführen.

Verfasst von

Arjan Molenaar

Contact

Let’s discuss how we can support your journey.