AWS Lambda ist der Serverless Computation Service von AWS . Dieser ermöglicht es, Code Event-getrieben auszuführen. Für jede Funktionalität muss dafür eine Lambda-Funktion mit einem Code-Segment definiert werden, welche durch Events ausgeführt werden kann. Beim Aufbau einer Serverless-Anwendungen auf der Basis von AWS ist es meist nötig, sehr viele Lambda-Funktionen zu definieren. Dabei ist es nicht unwahrscheinlich, dass sich benötigte Code-Teile – z. B. Libraries, CRUD-Operationen oder Business-Logik – wiederholen.
Mittels Lamdba Layers lassen sich diese Code-Teile auslagern und in verschiedenen Lambda-Funktionen verwenden.
Dies reduziert die Komplexität der jeweiligen Funktionen und führt zu eine besseren Wartbarkeit des gesamten Codes. So können z. B. Layers und Funktionen unabhängig entwickelt und getestet werden.
Layers in Aktion
Es existieren viele verschiedene Möglichkeiten, um AWS Lambda + Layers zu verwenden. Ich habe mich für das Serverless Framework mit Node.js entschieden. Lösungen mit anderen Programmiersprachen wie Python oder Frameworks wie SAM funktionieren jedoch ähnlich. Im Folgenden werden wir zwei Layers erstellen. Ein Dependencies Layer mit der Library Moment.js und ein Business Layer, welches auch als Lib in das Layer eingebunden wird. Diese beiden Layers werden dann von einer Lambda-Funktion eingebunden und verwendet. Der Code ist hier zu finden.
Initialisierung
Wenn du nicht mit dem Serverless Framework vertraut bist, existiert hier eine Anleitung um die cli aufzusetzen, die wir im Folgenden verwenden.
Zunächst setzten wir ein neues Serverless-Projekt mit folgendem Befehl auf:
1serverless create --template aws-nodejs --path lambda-layer-functions
Dies erzeugt einen neuen Ordner mit den Dateien handler.js und serverless.yml. Die handler.js enthält unsere spätere Lambda-Funktion. Die serverless.yml beschreibt unseren Cloudformation Stack. Wir könnten in dieser serverless.yml unsere Layers registrieren. Dies würde jedoch bei jedem Deployen der Funktion zu einer neuen Version der Layer führen. Deshalb legen wir, parallel zum Functions-Projekt, für unsere Layer ein separates Serverless-Projekt mit folgenden Befehl an:
1serverless create --template aws-nodejs --path lambda-layers
Aus dem nun erstellten Ordner können wir die handler.js und die Funktion aus der serverless.yml entfernen, da wir in dem Layer-Projekt keine Funktionen erstellen werden.
Erstellen des Dependency Layers
Nun erstellen wir das Dependency Layer mit der Bibliothek Moment . Dafür erstellen wir eine package.json unter lambda-layers/dependencieslayer/nodejs, indem wir im Ordner
1npm init
ausführen. Dabei setzen wir den Namen auf „dependencies-layer“ und nutzen sonst den default-Wert. Mittels
1npm install --save moment
im Ordner lambda-layers/dependencieslayer/nodejs fügen wir die Bibliothek „moment“ hinzu und laden die Abhängigkeiten herunter. Nun haben wir unseren Code für das Dependency Layer.
Dependency Layer registrieren
Nun registrieren wir das Dependency Layer in der lambda-layers/serverless.yml, indem wir folgenden Zeilen hinzufügen:
1layers: 2 dependencies: 3 path: dependencieslayer 4 name: ${self:provider.stage}-dependencies-layer # optional 5 description: Description of what the lambda layer does # optional 6 compatibleRuntimes: # optional 7 - nodejs 8 allowedAccounts: 9 - '*' # all accounts or specify your account!
Erstellen des Business Layers
Jetzt brauchen wir unseren Business-Code, den wir teilen wollen. Wir erstellen dafür an einem beliebigen anderen Ordner eine index.js mit:
1const theAnswerToLifeTheUniverseAndEverything = () => 42;
2
3module.exports = {
4 theAnswerToLifeTheUniverseAndEverything
5};
und fügen eine package.json mittels
1npm init
mit dem Namen „business-code“ hinzu. Jetzt wiederholen wir die Schritte, die wir für das Dependency Layers ausgeführt haben.
- Erstellen einer package.json unter lambda-layers/businesslayer/nodejs mit
1npm init
und setzen den Namen auf „business-layer“.
- Installieren der Dependencies.
Eigentlich sollte man den Business-Code in sein npm repository deployen und im Business Layer verwenden. Wir werden jedoch für das Tutorial den festen Pfad eintragen, um kein Repository zu benötigen. Deshalb installieren wir die Dependencies, indem wir im Ordner1npm install file:../../../businesscode
ausführen.
- Wir fügen unser Layer zur Layers lambda-layers/serverless.yml hinzu.
1layers: 2 business: 3 path: businesslayer 4 name: ${self:provider.stage}-business-layer # optional 5 description: Description of what the lambda layer does # optional 6 compatibleRuntimes: # optional 7 - nodejs 8 allowedAccounts: 9 - '*' # all accounts or specify your account!
Deploy Layers
Wenn wir nun „sls deploy“ im Layers-Ordner ausführen, werden unsere Layer nach AWS deployed. Die Ausgabe sollte wie folgt aussehen:
Unter Layers sehen wir die Amazon-Ressourcennamen (ARN) der erstellten Layers. Dieser benötigen wir später, um sie in unsere Funktion zu verwenden. Um einen Überblick über die vorliegenden Layers zu erhalten, kannst du diese in der AWS-Konsole unter Lambda > Layers ansehen. Dabei solltest du sicherstellen, dass du die richtige Region ausgewählt hast. In der Konsole solltest du nun etwa folgendes sehen:
Layers zur Funktion hinzufügen
Nun müssen wir die Layer noch in unser Funktion serverless.yml verwenden. Dafür fügen wir die ARN der Layer zu der Funktion wie im folgenden zu sehen hinzu.
1functions: 2 hello: 3 handler: src/app/handler.hello 4 layers: # layer refs 5 - ... arn...
Wenn wir nun sls deploy für die Funktion ausführen und uns die Konsole ansehen, sollten wir schon sehen, dass die Layer der Funktion hinzugefügt wurden.
Layers verwenden
Die Verwendung der Layers ist nun so einfach wie die Verwendung einer Library. Wir können in unserer handler.js wie folgt die Libraries importieren und dann verwenden.
1const moment = require('moment'); 2const {theAnswerToLifeTheUniverseAndEverything} = require('business-code');
Limits
Bei der Verwendung von Layers existieren momentan ein paar harte Limits, die hier zu finden sind. So ist die maximale Anzahl von Layers pro Funktion auf fünf und die Größe von Layers + Funktion package auf 250 MB begrenzt. Deshalb sollten die Schnitte, die man für seine Layers wählt, sinnvoll gewählt werden.
Zusammenfassung
Layers sind eine praktische Möglichkeit, um Code zwischen Lambda-Funktionen zu teilen. Sie helfen dabei, die Wartbarkeit des AWS-Lambda-Codes zu erhöhen, da durch die Auslagerung des Codes dieser separat getestet und erweitert werden kann. Somit erhält man kleine austauschbare Funktionen.
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Fabian Schmauder
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.