Beliebte Suchanfragen

Cloud Native

DevOps

IT-Security

Agile Methoden

Java

//

Sharing is caring: Lambda Layers mit Serverless und Node.js

22.5.2019 | 4 Minuten Lesezeit

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 Ordner
    1npm 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.

Beitrag teilen

Gefällt mir

0

//

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.