J'ai créé plusieurs fonctions Lambda à l'aide de l'éditeur Web. Jusqu'ici tout va bien. Je voudrais maintenant commencer à les étendre avec des modules (comme Q pour les promesses). Je ne peux pas comprendre comment faire sortir les modules vers Lambda afin qu'ils puissent être consommés par mes fonctions.
J'ai lu ceci mais cela semble impliquer la configuration d'un EC2 et l'exécution de fonctions Lambda à partir de là. Il existe un mécanisme pour télécharger un zip lors de la création d'une fonction mais cela semble impliquer l'envoi de fonctions développées localement. Depuis que je travaille dans l'éditeur Web, cela semble être un flux de travail étrange.
Comment puis-je simplement déployer certains modules à utiliser dans mes fonctions Lambda?
Réponses:
Vous ne pouvez pas charger des modules NPM sans télécharger un
.zip
fichier, mais vous pouvez en fait réduire ce processus à deux lignes de commande rapides.Voici comment:
Placez vos fichiers de fonction Lambda dans un répertoire séparé. En effet, vous installez des
npm
packages localement pour Lambda et vous souhaitez pouvoir isoler et tester ce que vous allez télécharger sur Lambda.Installez vos packages NPM localement avec
npm install packageName
pendant que vous êtes dans votre répertoire Lambda distinct que vous avez créé à l'étape 1.Assurez-vous que votre fonction fonctionne lors de l'exécution locale:
node lambdaFunc.js
(vous pouvez simplement commenter les deuxexport.handler
lignes de votre code pour adapter votre code pour qu'il s'exécute avec Node localement).Accédez au répertoire Lambda et compressez le contenu , assurez-vous de ne pas inclure le répertoire lui-même.
Si vous avez
aws-cli
installé, que je suggère d'avoir si vous voulez vous faciliter la vie, vous pouvez maintenant entrer cette commande:(pas de guillemets autour de la partie lambdaFunc ci-dessus au cas où vous vous poseriez la question comme je l'ai fait)
Vous pouvez maintenant cliquer sur tester dans la console Lambda.
Je suggère d'ajouter un court alias pour les deux commandes ci-dessus. Voici ce que j'ai dans le mien pour la commande de mise à jour Lambda beaucoup plus longue:
la source
aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
--zip-file fileb://
versus--zip-file file://
tout en utilisant ces étapes--zip-file fileb:
plutôtfile
pour moi. 2) sur MacOS, il semble être avec 3 barres obliques, par exemple, commefileb:///Users/wio/Documents
Un
.zip
fichier est requis pour inclure les modules npm dans Lambda. Et vous ne devriez vraiment pas utiliser l'éditeur Web Lambda pour beaucoup de choses - comme pour tout code de production, vous devriez développer localement, vous engager dans git, etc.MON FLUX:
1) Mes fonctions Lambda sont généralement des utilitaires d'aide pour un projet plus vaste, je crée donc un répertoire / aws / lambdas dans celui-ci pour les héberger.
2) Chaque répertoire lambda individuel contient un fichier index.js contenant le code de la fonction, un fichier package.json définissant les dépendances et un sous-répertoire / node_modules . (Le fichier package.json n'est pas utilisé par Lambda, c'est juste pour que nous puissions exécuter la
npm install
commande localement .)package.json:
3) Je .gitignore tous les répertoires node_modules et les fichiers .zip afin que les fichiers générés à partir des installations et de la compression de npm n'encombrent pas notre dépôt.
.gitignore:
4) Je cours
npm install
depuis le répertoire pour installer des modules et développer / tester la fonction localement.5) Je .zip le répertoire lambda et le télécharge via la console.
( IMPORTANT: n'utilisez pas l'utilitaire de compression de Mac à partir du Finder pour compresser le fichier! Vous devez exécuter zip à partir de la CLI depuis la racine du répertoire - voir ici )
REMARQUE:
Vous pouvez rencontrer des problèmes si vous installez les modules de nœuds localement sur votre Mac, car certains modules spécifiques à la plate-forme peuvent échouer lorsqu'ils sont déployés dans l'environnement Linux de Lambda. (Voir https://stackoverflow.com/a/29994851/165673 )
La solution consiste à compiler les modules sur une instance EC2 lancée à partir de l'AMI qui correspond au runtime Lambda Node.js que vous utilisez (voir cette liste des runtimes Lambda et leurs AMI respectives ).
Voir aussi Package de déploiement AWS Lambda dans Node.js - AWS Lambda
la source
Vous pouvez désormais utiliser des couches Lambda pour cela. Ajoutez simplement une couche contenant le package dont vous avez besoin et il fonctionnera parfaitement.
Suivez ce post: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
la source
J'espère que cela vous aidera, avec le framework Serverless, vous pouvez faire quelque chose comme ceci:
plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch)
2. Créez ensuite votre fonction Lambda, déployez-la parserverless deploy
, le package inclus dans serverless.yml sera là pour vous.Pour plus d'informations sur sans serveur: https://serverless.com/framework/docs/providers/aws/guide/quick-start/
la source
serverless plugin install --name pluginName
Le module npm doit être intégré à votre package nodejs et être téléchargé sur AWS Lambda Layers en tant que zip, vous devrez alors vous référer à votre module / js comme ci-dessous et utiliser les méthodes disponibles à partir de celui-ci. const mymodule = require ('/ opt / nodejs / MyLogger');
la source