Comment charger des modules npm dans AWS Lambda?

147

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?

Fook
la source
7
Tout est expliqué dans la documentation ici - docs.aws.amazon.com/lambda/latest/dg/…
arcseldon

Réponses:

198

Vous ne pouvez pas charger des modules NPM sans télécharger un .zipfichier, mais vous pouvez en fait réduire ce processus à deux lignes de commande rapides.

Voici comment:

  1. Placez vos fichiers de fonction Lambda dans un répertoire séparé. En effet, vous installez des npmpackages localement pour Lambda et vous souhaitez pouvoir isoler et tester ce que vous allez télécharger sur Lambda.

  2. Installez vos packages NPM localement avec npm install packageNamependant que vous êtes dans votre répertoire Lambda distinct que vous avez créé à l'étape 1.

  3. Assurez-vous que votre fonction fonctionne lors de l'exécution locale: node lambdaFunc.js(vous pouvez simplement commenter les deux export.handlerlignes de votre code pour adapter votre code pour qu'il s'exécute avec Node localement).

  4. Accédez au répertoire Lambda et compressez le contenu , assurez-vous de ne pas inclure le répertoire lui-même.

    zip -r lambdaFunc.zip .
    
  5. Si vous avez aws-cliinstallé, que je suggère d'avoir si vous voulez vous faciliter la vie, vous pouvez maintenant entrer cette commande:

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

    (pas de guillemets autour de la partie lambdaFunc ci-dessus au cas où vous vous poseriez la question comme je l'ai fait)

  6. Vous pouvez maintenant cliquer sur tester dans la console Lambda.

  7. 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:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    
JohnAllen
la source
11
Vous devrez peut-être indiquer explicitement la région que vous ciblez: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox
2
Bien que cela semble demander beaucoup plus de travail, passer par là, c'est vraiment une bien meilleure façon de construire ces expressions lambda ... merci beaucoup!
Mike Perrenoud
9
J'ai dû utiliser --zip-file fileb://versus --zip-file file://tout en utilisant ces étapes
McLovin
3
Assurez-vous de ne compresser que le contenu du répertoire et de le faire à partir de la CLI (l'utilisation de la commande 'compress' du Finder de Mac ne fonctionnera PAS ).
Yarin
3
C'était super utile ... au moins deux choses manquaient pour que cela fonctionne pour moi ... 1) c'était --zip-file fileb:plutôt filepour moi. 2) sur MacOS, il semble être avec 3 barres obliques, par exemple, commefileb:///Users/wio/Documents
Tobi
31

Un .zipfichier 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 installcommande localement .)

package.json:

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

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:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4) Je cours npm installdepuis 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 )

zip -r ../yourfilename.zip * 

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

Yarin
la source
9

J'espère que cela vous aidera, avec le framework Serverless, vous pouvez faire quelque chose comme ceci:

  1. Ajoutez ces éléments dans votre fichier serverless.yml:

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2. Créez ensuite votre fonction Lambda, déployez-la par serverless 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/

Toai
la source
vous devez d'abord l'installerserverless plugin install --name pluginName
Liad Livnat
1

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');

Sunil Chauraha
la source