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?
Antworten:
Sie können NPM-Module nicht laden, ohne eine
.zip
Datei hochzuladen , aber Sie können diesen Prozess tatsächlich auf zwei schnelle Befehlszeilen reduzieren.Hier ist wie:
Legen Sie Ihre Lambda-Funktionsdatei (en) in einem separaten Verzeichnis ab. Dies liegt daran, dass Sie
npm
Pakete lokal für Lambda installieren und in der Lage sein möchten, zu isolieren und zu testen, was Sie auf Lambda hochladen.Installieren Sie Ihre NPM-Pakete lokal mit,
npm install packageName
während Sie sich in Ihrem separaten Lambda-Verzeichnis befinden, das Sie in Schritt 1 erstellt haben.Stellen Sie sicher, dass Ihre Funktion bei lokaler Ausführung funktioniert:
node lambdaFunc.js
(Sie können einfach die beidenexport.handler
Zeilen in Ihrem Code auskommentieren, um Ihren Code für die lokale Ausführung mit Node anzupassen.)Gehen Sie zum Lambda-Verzeichnis und komprimieren Sie den Inhalt . Achten Sie darauf , das Verzeichnis selbst nicht einzuschließen.
Wenn Sie das
aws-cli
installiert haben, was ich vorschlage, wenn Sie Ihr Leben einfacher machen möchten, können Sie jetzt diesen Befehl eingeben:(Keine Anführungszeichen um den LambdaFunc-Teil oben, falls Sie sich fragen, wie ich es getan habe)
Jetzt können Sie in der Lambda-Konsole auf Test klicken .
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:
quelle
aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
--zip-file fileb://
versus verwenden,--zip-file file://
während ich diese Schritte benutzte--zip-file fileb:
stattfile
für mich. 2) unter MacOS scheint es mit 3 Schrägstrichen zu sein, zB wiefileb:///Users/wio/Documents
Eine
.zip
Datei 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 install
Befehl lokal ausführen können .)package.json:
3) Ich .gitignore alle node_modules-Verzeichnisse und .zip-Dateien, damit die aus npm-Installationen und Zippen generierten Dateien unser Repo nicht überladen.
.gitignore:
4) Ich laufe
npm install
aus 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 ).
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
quelle
Sie können jetzt Lambda-Ebenen für diese Angelegenheiten verwenden. Fügen Sie einfach eine Ebene hinzu, die das benötigte Paket enthält, und es läuft einwandfrei.
Folgen Sie diesem Beitrag: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
quelle
Ich hoffe, dies hilft. Mit dem Serverless Framework können Sie Folgendes tun:
plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch)
2. Erstellen Sie dann Ihre Lambda-Funktion und stellen Sie sieserverless deploy
bereit. 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/
quelle
serverless plugin install --name pluginName
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');
quelle