AWS Lambda-Fehler: "Modul '/ var / task / index' kann nicht gefunden werden"

87

Node.js Alexa Task Issue

Ich codiere derzeit eine Node.js-Alexa-Task über AWS Lambda und habe versucht, eine Funktion zu codieren, die Informationen von der OpenWeather-API empfängt und in eine Variable namens analysiert weather. Der relevante Code lautet wie folgt:

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

Ich habe dieses Snippet unzählige Male in Cloud9 und anderen IDEs ausgeführt, und es scheint einwandfrei zu funktionieren. Wenn ich es jedoch in ein Paket komprimiere und auf AWS Lambda hochlade, wird folgende Fehlermeldung angezeigt:

{
    "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)"
    ]
}

Ich habe unzählige Artikel durchsucht und Module-Js, Request und viele andere Node-Module installiert, mit denen dieser Code ausgeführt werden soll, aber nichts scheint dieses Problem zu beheben. Hier ist mein Verzeichnis, nur für den Fall:

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

Weiß jemand, was das Problem sein könnte? Vielen Dank im Voraus.

Anthony Krivonos
quelle
Hier ist die Protokollausgabe für meinen 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
Stellen Sie neben der Antwort zum Zippen mit dem Terminal auf einem Mac auch sicher, dass Ihre Codedatei "index.js" heißt. Meins hatte einen aussagekräftigeren Namen, was den Fehler verursachte.
Art
1
@Art Das war mein Problem. Ich habe eine test.js gezippt und sie hat einen unbehandelten Fehler ausgelöst. Nach dem Ändern in index.js hat es gut funktioniert. Vielen Dank.
Hudspeth

Antworten:

229

Behoben! Mein Problem war, dass ich versucht habe, die Datei mit der im Finder integrierten Komprimierungsfunktion meines Mac zu komprimieren.

Wenn Sie ein Mac - Benutzer, wie ich sind, sollten Sie das folgende Skript im Terminal ausgeführt , wenn Sie im Stammverzeichnis des Projekts sind (Ordner mit Ihren index.js, node_modulesusw. Dateien).

zip -r ../yourfilename.zip *

Für Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Anthony Krivonos
quelle
7
Ich habe wie folgt gezippt: "zip -r folder folder.zip" und das ist natürlich fehlgeschlagen. Vielen Dank für den Tipp, nur die Dateien und nicht das Verzeichnis
Dane Macaulay
6
Wie wäre es mit Windows?
Alok Rajasukumaran
Stellen Sie auch sicher, dass Sie die Funktion benennenindex.js
Knowledge
Gibt es eine Möglichkeit, dies von außerhalb des Verzeichnisses zu tun?
Andrhamm
1
@andrhamm Ja. Das Format ist zip -r /path/to/destination.zip /path/to/source/directory/*. Das komprimiert den Inhalt des Verzeichnisses. Wenn Sie das Verzeichnis selbst auch komprimieren möchten, verwenden Sie das Verzeichnis / path / to / source / ohne das *.
Qaz
23

Update auf die akzeptierte Antwort: Wenn dieser Fehler auftritt, bedeutet dies, dass Ihre Zip-Datei nicht in der gültigen Form vorliegt, die AWS benötigt.

Wenn Sie auf zip doppelklicken, finden Sie Ihren Ordner in Ihrer Codedatei, aber Lambda möchte, dass beim Doppelklicken auf zip direkte Codedateien angezeigt werden.

Um das zu erreichen:

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

Laden Sie dann index.zipauf AWS Lambda hoch.

Ashutosh Jha
quelle
in Windows Git Bast Wurffehler "Befehl nicht gefunden", wie kann man diese Idee lösen?
Pardeep Jain
1
Dies ist ein Befehl von Ubuntu, bitte googeln Sie ihn für Windows oder wie man eine Zip-Datei über die Eingabeaufforderung erstellt
Ashutosh Jha
20

Überprüfen Sie, ob Dateiname und Handlername identisch sind:

In diesem Fall erwarten wir, dass sich unser gesamter Code in der Datei <code> bundle.ls </ code> befindet

Das bedeutet, dass die zipDatei eine bundle.jsExportfunktion handlerhat:

exports.handler = (event, context, callback) => {//...}
Zooblin
quelle
4

In meinem Fall lag es daran, dass ich die Handler-Datei im inneren src-Verzeichnis hatte.

Ich musste die 'Handler'-Eigenschaft in Lambda ändern von:

index.handler

zu

src/index.handler
Pete
quelle
Ich bin auch darauf gestoßen; [Windows] Es war einfach so, dass ich mit der rechten Maustaste auf den APITeil meines Repos geklickt und verwendet habe Send To > Compressed Folder. Dadurch entsteht ein Reißverschluss mit Struktur api/etc, daher die Ausnahme!
C Bauer
3

Dies ist wahrscheinlich ein Berechtigungsproblem mit Dateien in Ihrer Bereitstellungs-Zip. Probieren Sie chmod 777Ihre Dateien aus, bevor Sie sie in eine Zip-Datei packen.

spg
quelle
2
Leider scheint das Problem dadurch nicht behoben zu werden. Ich habe versucht, den planyrOrdner in einem anderen Ordner ohne Erfolg zu komprimieren . Mein Handlername und die wichtigsten JavaScript-Dateinamen stimmen überein ( index).
Anthony Krivonos
chmod 777ist ein schlechter Rat ... dies eröffnet der Öffentlichkeit die Erlaubnis zum Schreiben, Lesen und Ausführen. Bitte finden Sie immer die Routenursache des Problems. Versuchen Sie immer, die Sicherheitsauswirkungen der Ausführung zu verstehen, die Ihnen jemand im Internet vorschreibt. Sicherheit ist wichtig und muss standardmäßig in unserem Code enthalten sein.
Exadra37
3

In meinem Fall enthielt das Archiv einen Ordner "src" mit der Datei index.js, daher musste ich in den Handler "src / index.handler" einfügen.

Geben Sie hier die Bildbeschreibung ein

Sergey Smolnikov
quelle
0

In meinem Fall musste ich ersetzen

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

mit

exports.handler = function (event, context, callback) {
Ianaz
quelle
0

Ich habe diesen Fehler erhalten, als ich lambci/lambda:nodejs8.10in Windows verwendet habe.

Ich hatte alle oben aufgeführten Lösungen ausprobiert, aber keine davon konnte mir bei der Lösung meines Problems helfen (obwohl der Fehlerstapel genauso aussieht wie die Frage).

Hier ist meine einfache Lösung:

  1. Verwenden Sie --entrypointflag, um einen Container auszuführen und herauszufinden, ob die Datei in den Container eingebunden ist. Es stellt sich heraus, dass ich möglicherweise ein Problem mit dem Freigabe-Laufwerk mit meinem Docker Desktop habe.
  2. Ich habe am Tag zuvor meinen Docker-Daemon gewechselt, aber bis auf dieses Problem funktioniert alles einwandfrei.
  3. Wenn Sie mein Laufwerk erneut an Docker Desktop anschließen möchten, können Sie sowohl den dockerBefehl verwenden als auch einfach die Docker Desktop-Einstellung öffnen, um sie anzuwenden.
James
quelle
0

In meinem Fall wurde dies dadurch verursacht, dass dem Knoten der Speicher ausgeht. Ich habe das behoben, indem ich --memory-size 1500meinem aws lambda create-function ...Befehl hinzugefügt habe .

Samuli Pahaoja
quelle