Erreur AWS Lambda: "Impossible de trouver le module '/ var / task / index'"

87

Problème de tâche Alexa Node.js

Je suis en train de coder une tâche Alexa Node.js via AWS Lambda, et j'ai essayé de coder une fonction qui reçoit des informations de l'API OpenWeather et les analyse en une variable appelée weather. Le code pertinent est le suivant:

var request = require('request');
var weather = "";
function isBadWeather(location) {
      var endpoint = "http://api.openweathermap.org/data/2.5/weather?q=" + location + "&APPID=205283d9c9211b776d3580d5de5d6338";
      var body = "";
      request(endpoint, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                  body = JSON.parse(body);
                  weather = body.weather[0].id;
            }
      });
}

function testWeather()
{
      setTimeout(function() {
      if (weather >= 200 && weather < 800)
            weather = true;
      else
            weather = false;
      console.log(weather);
      generateResponse(buildSpeechletResponse(weather, true), {});
      }, 500);
}

J'ai exécuté cet extrait d'innombrables fois dans Cloud9 et d'autres IDE, et il semble fonctionner parfaitement. Cependant, lorsque je le compresser dans un package et le télécharger sur AWS Lambda, j'obtiens l'erreur suivante:

{
    "errorMessage": "Cannot find module '/var/task/index'",
    "errorType": "Error",
    "stackTrace": [
        "Function.Module._load (module.js:276:25)",
        "Module.require (module.js:353:17)",
        "require (internal/module.js:12:17)"
    ]
}

J'ai parcouru d'innombrables articles et installé module-js, request et de nombreux autres modules Node qui devraient faire fonctionner ce code, mais rien ne semble résoudre ce problème. Voici mon annuaire, au cas où:

- planyr.zip
   - index.js
   - node_modules
   - package.json

Quelqu'un sait-il quel pourrait être le problème? Merci d'avance.

Anthony Krivonos
la source
Voici la sortie du journal pour mon code: START RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Version: $LATEST Unable to import module 'index': Error at Function.Module._resolveFilename (module.js:325:15) at Function.Module._load (module.js:276:25) at Module.require (module.js:353:17) at require (internal/module.js:12:17) END RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 REPORT RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Duration: 55.76 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 16 MB
Anthony Krivonos
3
En plus de la réponse sur la compression à l'aide d'un terminal sur un Mac, assurez-vous également que votre fichier de code s'appelle «index.js». Le mien avait un nom plus descriptif, générant l'erreur.
Art
1
@Art C'était mon problème. J'ai zippé un test.js et il a jeté une erreur non gérée. Après l'avoir changé en index.js, cela a bien fonctionné. Merci.
Hudspeth

Réponses:

229

Corrigé! Mon problème était que j'ai essayé de compresser le fichier en utilisant la fonction de compression intégrée de mon Mac dans le Finder.

Si vous êtes un utilisateur Mac, comme moi, vous devez exécuter le script suivant dans le terminal lorsque vous êtes dans le répertoire racine de votre projet (dossier contenant vos index.js, node_modulesfichiers , etc.).

zip -r ../yourfilename.zip *

Pour les fenêtres:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Anthony Krivonos
la source
7
je zippais comme ceci: "zip -r dossier folder.zip" et bien sûr cela a échoué. merci pour la pointe pour compresser simplement les fichiers et non le répertoire
Dane Macaulay
6
Et les fenêtres?
Alok Rajasukumaran
assurez-vous également de nommer la fonctionindex.js
Knowledge
Existe-t-il un moyen de le faire en dehors du répertoire?
andrhamm
1
@andrhamm Oui. Le format est zip -r /path/to/destination.zip /path/to/source/directory/*. Cela zippe le contenu du répertoire. Si vous souhaitez également compresser le répertoire lui-même, utilisez / chemin / vers / source / répertoire sans *.
Qaz
23

Mettre à jour la réponse acceptée: lorsque cette erreur se produit, cela signifie que votre fichier zip n'est pas sous la forme valide requise par AWS.

Si vous double-cliquez sur zip, vous trouverez votre dossier à l'intérieur de votre fichier de code, mais lambda veut que lorsque vous double-cliquez sur zip, il doit afficher les fichiers de code directs.

Pour y parvenir:

open terminal  
cd your-lambda-folder 
zip -r index.zip *

Ensuite, téléchargez index.zipsur AWS Lambda.

Ashutosh Jha
la source
dans windows git bast erreur de lancement "commande non trouvée", comment résoudre cette idée?
Pardeep Jain
1
Ceci est la commande d'Ubuntu, s'il vous plaît google pour Windows ou comment créer un zip à partir de l'invite de commande
Ashutosh Jha
20

Vérifiez que le nom de fichier et le nom du gestionnaire sont identiques:

Dans ce cas, nous prévoyons que tout notre code sera dans le fichier <code> bundle.ls </code>

Cela signifie que ce zipfichier a un bundle.jsfichier qui exporte la handlerfonction:

exports.handler = (event, context, callback) => {//...}
zooblin
la source
4

Dans mon cas, c'était parce que j'avais le fichier du gestionnaire dans le répertoire src interne.

J'ai dû changer la propriété 'Handler' dans Lambda de:

index.handler

à

src/index.handler
Pete
la source
J'ai aussi couru là-dessus; [Windows] c'était simplement que je faisais un clic droit sur la APIpartie de mon repo et que je l'utilisais Send To > Compressed Folder. Cela crée un zip avec structure api/etc, d'où l'exception!
C Bauer
3

Il s'agit probablement d'un problème d'autorisations avec des fichiers dans votre zip de déploiement. Essayez chmod 777vos fichiers avant de les emballer dans un fichier zip.

spg
la source
2
Malheureusement, cela ne semble pas résoudre le problème. J'ai essayé de compresser le planyrdossier dans un autre dossier en vain. Mon nom de gestionnaire et les noms de fichiers JavaScript principaux correspondent ( index).
Anthony Krivonos
chmod 777est un mauvais conseil ... cela ouvre des autorisations au public pour écrire, lire et exécuter. Veuillez toujours trouver la cause de l'itinéraire du problème. Essayez toujours de comprendre les implications pour la sécurité de l'exécution de tout ce que quelqu'un sur Internet vous demande de faire. La sécurité est importante et doit être dans notre code par défaut.
Exadra37
3

Dans mon cas, l'archive contenait un dossier "src" avec un fichier index.js, j'ai donc dû mettre au gestionnaire: "src / index.handler"

entrez la description de l'image ici

Sergey Smolnikov
la source
0

Dans mon cas, j'ai dû remplacer

exports.handler = function eventHandler (event, context) {

avec

exports.handler = function (event, context, callback) {
ianaz
la source
0

J'ai eu cette erreur lorsque j'utilisais lambci/lambda:nodejs8.10dans Windows.

J'avais essayé toutes les solutions énumérées ci-dessus, mais aucune d'entre elles ne pouvait m'aider à résoudre mon problème (même si la pile d'erreurs ressemble à la question).

Voici ma solution simple:

  1. en utilisant l' --entrypointindicateur pour exécuter un conteneur afin de savoir si le fichier est monté dans le conteneur. Il s'avère que je peux avoir le problème du lecteur de partage avec mon Docker Desktop.
  2. J'ai changé mon démon docker la veille, mais tout fonctionne bien sauf ce problème.
  3. Quoi qu'il en soit, remontez mon lecteur sur Docker Desktop, vous pouvez à la fois utiliser la dockercommande ou simplement ouvrir le paramètre Docker Desktop à appliquer.
James
la source
0

Dans mon cas, cela a été causé par le manque de mémoire de Node. J'ai corrigé cela en ajoutant --memory-size 1500à ma aws lambda create-function ...commande.

Samuli Pahaoja
la source