Wie lade ich npm-Module in AWS Lambda?

147

Ich habe mehrere Lambda-Funktionen mit dem webbasierten Editor erstellt. So weit, ist es gut. Ich möchte jetzt damit beginnen, diese mit Modulen zu erweitern (z. B. Q für Versprechen). Ich kann nicht herausfinden, wie ich die Module zu Lambda bringen kann, damit sie von meinen Funktionen genutzt werden können.

Ich habe dies durchgelesen, aber es scheint darum zu gehen, einen EC2 einzurichten und Lambda-Funktionen von dort aus auszuführen. Es gibt einen Mechanismus zum Hochladen einer Zip-Datei beim Erstellen einer Funktion, bei dem jedoch lokal entwickelte Funktionen gesendet werden müssen. Da ich im webbasierten Editor arbeite, scheint das ein seltsamer Workflow zu sein.

Wie kann ich einfach einige Module zur Verwendung in meinen Lambda-Funktionen bereitstellen?

Fook
quelle
7
Es wird alles in den Dokumenten hier erklärt - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Antworten:

196

Sie können NPM-Module nicht laden, ohne eine .zipDatei hochzuladen , aber Sie können diesen Prozess tatsächlich auf zwei schnelle Befehlszeilen reduzieren.

Hier ist wie:

  1. Legen Sie Ihre Lambda-Funktionsdatei (en) in einem separaten Verzeichnis ab. Dies liegt daran, dass Sie npmPakete lokal für Lambda installieren und in der Lage sein möchten, zu isolieren und zu testen, was Sie auf Lambda hochladen.

  2. Installieren Sie Ihre NPM-Pakete lokal mit, npm install packageNamewährend Sie sich in Ihrem separaten Lambda-Verzeichnis befinden, das Sie in Schritt 1 erstellt haben.

  3. Stellen Sie sicher, dass Ihre Funktion bei lokaler Ausführung funktioniert: node lambdaFunc.js(Sie können einfach die beiden export.handlerZeilen in Ihrem Code auskommentieren, um Ihren Code für die lokale Ausführung mit Node anzupassen.)

  4. Gehen Sie zum Lambda-Verzeichnis und komprimieren Sie den Inhalt . Achten Sie darauf , das Verzeichnis selbst nicht einzuschließen.

    zip -r lambdaFunc.zip .
    
  5. Wenn Sie das aws-cliinstalliert haben, was ich vorschlage, wenn Sie Ihr Leben einfacher machen möchten, können Sie jetzt diesen Befehl eingeben:

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (Keine Anführungszeichen um den LambdaFunc-Teil oben, falls Sie sich fragen, wie ich es getan habe)

  6. Jetzt können Sie in der Lambda-Konsole auf Test klicken .

  7. Ich schlage vor, einen kurzen Alias ​​für beide oben genannten Befehle hinzuzufügen. Folgendes habe ich für den viel längeren Lambda-Update-Befehl in meinem:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    
JohnAllen
quelle
10
Möglicherweise müssen Sie die Region, auf die Sie abzielen, explizit angeben: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox
2
Es scheint zwar viel mehr Arbeit zu sein, aber es ist wirklich eine viel bessere Möglichkeit, diese Lambda-Ausdrücke zu erstellen ... vielen Dank!
Mike Perrenoud
9
Ich musste --zip-file fileb://versus verwenden, --zip-file file://während ich diese Schritte benutzte
McLovin
2
Stellen Sie sicher, dass Sie nur den Inhalt des Verzeichnisses komprimieren und dies über die CLI tun (die Verwendung des Befehls 'compress' im Mac-Finder funktioniert NICHT ).
Yarin
2
Das war super nützlich. Es fehlten mindestens zwei Dinge, damit dies für mich funktioniert. 1) Es war --zip-file fileb:statt filefür mich. 2) unter MacOS scheint es mit 3 Schrägstrichen zu sein, zB wiefileb:///Users/wio/Documents
Tobi
29

Eine .zipDatei ist erforderlich, um npm- Module in Lambda aufzunehmen. Und Sie sollten den Lambda-Webeditor wirklich nicht für vieles verwenden - wie bei jedem Produktionscode sollten Sie sich lokal entwickeln, sich zu Git verpflichten usw.

MEIN FLOW:

1) Meine Lambda-Funktionen sind normalerweise Hilfsdienstprogramme für ein größeres Projekt, daher erstelle ich darin ein Verzeichnis / aws / lambdas , um sie unterzubringen .

2) Jedes einzelne Lambda-Verzeichnis enthält eine index.js- Datei mit dem Funktionscode, eine package.json- Datei, die Abhängigkeiten definiert, und ein Unterverzeichnis / node_modules . (Die Datei package.json wird von Lambda nicht verwendet, nur damit wir den npm installBefehl lokal ausführen können .)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3) Ich .gitignore alle node_modules-Verzeichnisse und .zip-Dateien, damit die aus npm-Installationen und Zippen generierten Dateien unser Repo nicht überladen.

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Ich laufe npm installaus dem Verzeichnis heraus, um Module zu installieren und die Funktion lokal zu entwickeln / testen.

5) Ich zippe das Lambda-Verzeichnis und lade es über die Konsole hoch.

( WICHTIG: Verwenden Sie nicht das Dienstprogramm 'compress' von Mac aus dem Finder, um die Datei zu komprimieren! Sie müssen zip über die CLI im Stammverzeichnis des Verzeichnisses ausführen - siehe hier ).

zip -r ../yourfilename.zip * 

HINWEIS:

Wenn Sie die Knotenmodule lokal auf Ihrem Mac installieren, können Probleme auftreten, da einige plattformspezifische Module bei der Bereitstellung in der Linux-basierten Umgebung von Lambda möglicherweise fehlschlagen. (Siehe https://stackoverflow.com/a/29994851/165673 )

Die Lösung besteht darin, die Module auf einer vom AMI gestarteten EC2-Instanz zu kompilieren, die der von Ihnen verwendeten Laufzeit von Lambda Node.j entspricht (siehe diese Liste der Lambda-Laufzeiten und ihrer jeweiligen AMIs ).


Siehe auch AWS Lambda-Bereitstellungspaket in Node.js - AWS Lambda

Yarin
quelle
9

Ich hoffe, dies hilft. Mit dem Serverless Framework können Sie Folgendes tun:

  1. Fügen Sie diese Dinge in Ihre serverless.yml-Datei ein:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Erstellen Sie dann Ihre Lambda-Funktion und stellen Sie sie serverless deploybereit. Das in serverless.yml enthaltene Paket ist für Sie da.

Weitere Informationen zu serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/

Toai
quelle
Sie müssen es zuerst installierenserverless plugin install --name pluginName
Liad Livnat
1

Das npm-Modul muss in Ihrem nodejs-Paket gebündelt und als zip auf AWS Lambda Layers hochgeladen werden. Dann müssen Sie auf Ihr Modul / js wie folgt verweisen und die verfügbaren Methoden daraus verwenden. const mymodule = require ('/ opt / nodejs / MyLogger');

Sunil Chauraha
quelle