web-dev-qa-db-fra.com

Comment charger des modules npm dans AWS Lambda?

J'ai créé plusieurs fonctions Lambda à l'aide de l'éditeur Web. Jusqu'ici tout va bien. Je voudrais maintenant commencer à étendre ceux-ci avec des modules (tels que Q pour les promesses). Je n'arrive pas à comprendre comment transmettre les modules à Lambda afin qu'ils puissent être consommés par mes fonctions.

J'ai lu this 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 basé sur le Web, cela semble être un flux de travail étrange.

Comment puis-je simplement déployer certains modules pour les utiliser dans mes fonctions Lambda?

89
Fook

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

Voici comment:

  1. Placez votre fichier de fonction Lambda dans un répertoire séparé. En effet, vous installez npm paquets 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 packageName alors que vous vous trouvez dans votre répertoire Lambda séparé 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 lignes export.handler de votre code pour adapter votre code à l'exécution avec Node localement).

  4. Allez dans le répertoire Lambda et compressez le conten, assurez-vous que not pour inclure le répertoire lui-même.

    Zip -r lambdaFunc.Zip .
    
  5. Si vous avez le aws-cli installé, ce que je suggère d'avoir si vous voulez vous simplifier 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 même question que moi)

  6. Vous pouvez maintenant cliquer sur test 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 beaucoup plus longue de mise à jour Lambda:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --Zip-file fileb://~/path/to/your/lambdaFunc.Zip"
    
150
JohnAllen

Un fichier .Zip est requis pour inclure npm dans Lambda. Et vous ne devriez vraiment pas utiliser l'éditeur Web Lambda pour une grande partie de tout, comme pour tout code de production, vous devriez développer localement, vous engager à git, etc.

MON FLUX:

1) Mes fonctions Lambda sont généralement des utilitaires auxiliaires pour un projet plus important. Je crée donc un répertoire /aws/lambdas pour les héberger.

2) Chaque répertoire individuel lambda contient un fichier index.js contenant le code de la fonction, un package.json fichier définissant les dépendances et un sous-répertoire /node_modules . (Le fichier package.json n'est pas utilisé par Lambda, c'est uniquement pour pouvoir exécuter localement la commande npm install.)

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 npm et des compressions ne fouillent pas notre référentiel.

. gitignore:

# Ignore node_modules
**/node_modules

# Ignore any Zip files
*.Zip

4) J'installe des modules, développe et teste localement

5) Je compresser le répertoire lambda et le télécharger via la console.

( IMPORTANT: N'utilisez pas l'utilitaire 'compresser' de Mac à partir du Finder pour compresser le fichier! Vous devez exécuter Zip à partir de la CLI à partir de la racine du répertoire. - voir ici )

Zip -r ../yourfilename.Zip * 

Voir aussi Package de déploiement AWS Lambda dans Node.js - AWS Lambda


NOTE:

Vous pourriez rencontrer un problème lorsqu'un module tel que PhantomJS génère des fichiers binaires spécifiques à un système d'exploitation. Ainsi, le package de noeud créé localement sur OSX échoue dans Lambda.

La réponse que j'ai trouvée ici était d'utiliser ces scripts pour le construire dans un conteneur Docker.

14
Yarin

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 avec serverless deploy, le paquet inclus dans serverless.yml sera à votre disposition.

Pour plus d'informations sur serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/

7
Toai

Vous pouvez maintenant utiliser les couches Lambda pour cela. Ajoutez simplement une couche contenant le paquet dont vous avez besoin et elle fonctionnera parfaitement.

Suivez ce post: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e

2
Eldad Hauzman