So fügen Sie NodeJs-Bibliotheksabhängigkeiten in einer AWS Lambda-Schicht mit Serverless Framework hinzu

AWS hat auf der re: Invent 2018 ein nettes Lambda-Layer-Feature vorgestellt, mit dem Entwickler zur Laufzeit bis zu fünf Pakete in eine bestimmte Funktion einbinden können. Dies fördert die gemeinsame Nutzung von Komponenten und hält das Kernfunktionspaket so klein wie möglich.

Anwendungsfall

In diesem Beispiel verschiebe ich die Laufzeitabhängigkeiten des Knotens aus dem Lambda-Funktionscode, indem ich sie in eine Ebene lege.

Aktualisieren Sie zunächst auf v1.34.0 oder höher, um Layer-Unterstützung zu erhalten, und erstellen Sie ein serverloses Projekt:

$ npm ich -g serverless
$ serverless create --template aws-nodejs --path myTestLayer

Um Bibliotheken in eine Ebene aufzunehmen, platzieren Sie sie in der Ebene / nodejs / node_modules. BITTE BEACHTEN SIE, dass der Verzeichnisname von nodejs nicht zufällig ist und nodejs sein muss.

Referenz

Ich füge nun Lodash- und Momentabhängigkeiten wie folgt hinzu:

$ cd myTestLayer
$ mkdir -p layer / nodejs
$ cd layer / nodejs
$ npm install --save lodash moment

Fügen Sie als Nächstes die Layer-Konfiguration zu serverless.yml hinzu, um den Layer zu definieren, der die NodeJS-Bibliotheken enthält. Die path-Eigenschaft ist ein Pfad zu einem Verzeichnis, das als Ihre Ebene veröffentlicht wird:

Lagen:
  commonLibs:
    Pfad: Ebene
    kompatibleLaufzeiten:
      - nodejs8.10

Fügen Sie anschließend Ihre Funktion in serverless.yml hinzu und geben Sie an, dass Ihre Funktion den Layer verwendet, den Sie veröffentlichen:

Funktionen:
  Hallo:
    Handler: handler.hello
    Lagen:
        # Der Referenzname wird durch TitleCasing des Layernamens und Anhängen von LambdaLayer generiert
      - {Ref: CommonLibsLambdaLayer}

Die serverless.yml sollte nun so aussehen:

Dienst: myTestLayer
Anbieter:
  Name: aws
  Laufzeit: nodejs8.10
  region: ap-südost-2
Funktionen:
  Hallo:
    Handler: handler.hello
    Lagen:
        # Der Referenzname wird durch TitleCasing des Layernamens und Anhängen von LambdaLayer generiert
      - {Ref: CommonLibsLambdaLayer}
Lagen:
  commonLibs:
    Pfad: Ebene
    kompatibleLaufzeiten:
      - nodejs8.10

Jetzt müssen wir unseren Handler schreiben. Die Lambda-Funktion ist ein Taschenrechner: Addiere oder subtrahiere die Anzahl der Tage zu einem heutigen Datum. Ersetze den Inhalt von handler.js durch den folgenden Code:

"use strict";
const _ = require ("lodash");
const moment = require ("moment");
module.exports.hello = async (Ereignis, Kontext, Rückruf) => {
  const curried = _.curry (berechneDatum);
  Rückruf (null, curried (moment (). format ()) (event));
};
const berechneDatum = (DatumZeit, Tage) => {
  Moment zurück ()
    .add (Tage, "Tage")
    .format ("MMMM JJJJ, h: mm: ss a");
};

Stellen Sie die Layer- und die aktualisierte Funktion wie folgt bereit

$ serverless deploy

Testen wir es mit der folgenden Befehlszeile:

#data sind Tage, die Sie zum heutigen Datum hinzufügen oder subtrahieren möchten
$ serverless invoke --function hello --data = 2

Das ist alles! Sie bekommen jetzt das Datum berechnet!

Die vollständige Quelle dieses Beispiels finden Sie hier.

AWS Lambda Runtimes

Sie können jetzt beim Erstellen oder Aktualisieren einer Funktion eine benutzerdefinierte Laufzeit auswählen. Bei dieser Auswahl muss die Funktion (in ihrem Code oder in einer Ebene) eine ausführbare Datei namens bootstrap enthalten, die für die Kommunikation zwischen Ihrem Code (der eine beliebige Programmiersprache verwenden kann) und der Lambda-Umgebung verantwortlich ist.

Ausführen von Selen und Headless Chrome auf AWS Lambda Layern