AWS Lambda Error: „Nie można znaleźć modułu '/ var / task / index'”

87

Problem z zadaniem Alexa Node.js

Obecnie koduję zadanie Node.js Alexa za pośrednictwem AWS Lambda i próbuję zakodować funkcję, która odbiera informacje z interfejsu API OpenWeather i analizuje je na zmienną o nazwie weather. Odpowiedni kod jest następujący:

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

Uruchomiłem ten fragment niezliczoną ilość razy w Cloud9 i innych IDE i wydaje się, że działa bezbłędnie. Jednak gdy spakuję go do pakietu i wgram do AWS Lambda, pojawia się następujący błąd:

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

Przejrzałem niezliczone artykuły i zainstalowałem module-js, request i wiele innych modułów Node, które powinny spowodować uruchomienie tego kodu, ale wydaje się, że nic nie rozwiązuje tego problemu. Oto mój katalog, na wszelki wypadek:

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

Czy ktoś wie, na czym może polegać problem? Z góry bardzo dziękuję.

Anthony Krivonos
źródło
Oto wynik dziennika dla mojego kodu: 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
Oprócz odpowiedzi na temat kompresowania za pomocą terminala na komputerze Mac, upewnij się również, że plik kodu nazywa się „index.js”. Mój miał bardziej opisową nazwę, powodując błąd.
Art.
1
@Art To był mój problem. Spakowałem plik test.js i wyrzucił nieobsługiwany błąd. Po zmianie na index.js działało dobrze. Dzięki.
Hudspeth

Odpowiedzi:

229

Naprawione! Mój problem polegał na tym, że próbowałem spakować plik za pomocą wbudowanej funkcji kompresji mojego Maca w Finderze.

Jeśli jesteś użytkownikiem Mac, jak ja, należy uruchomić następujący skrypt w terminalu, gdy jesteś w głównym katalogu projektu (folder zawierający index.js, node_modulesitd plików).

zip -r ../yourfilename.zip *

Dla Windowsa:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Anthony Krivonos
źródło
7
Kompresowałem w ten sposób: "zip -r folder folder.zip" i oczywiście to się nie udało. dzięki za wskazówkę dotyczącą po prostu spakowania plików, a nie katalogu
Dane Macaulay
6
A co z oknami?
Alok Rajasukumaran
pamiętaj również, aby nazwać funkcjęindex.js
Knowledge
Czy można to zrobić spoza katalogu?
andrhamm
1
@andrhamm Yes. Format to zip -r /path/to/destination.zip /path/to/source/directory/*. To spakuje zawartość katalogu. Jeśli chcesz również spakować sam katalog, użyj / path / to / source / katalog bez *.
Qaz
23

Zaktualizuj zaakceptowaną odpowiedź: gdy wystąpi ten błąd, oznacza to, że plik zip nie jest w prawidłowej formie, której wymaga AWS.

Jeśli klikniesz dwukrotnie na zip, znajdziesz swój folder w tym pliku z kodem, ale lambda chce, aby po dwukrotnym kliknięciu zip pokazywał bezpośrednie pliki z kodem.

Osiągnąć to:

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

Następnie prześlij index.zipdo AWS Lambda.

Ashutosh Jha
źródło
w systemie Windows git bast rzuca błąd "nie znaleziono polecenia", jak rozwiązać ten każdy pomysł?
Pardeep Jain
1
To jest polecenie Ubuntu, wygoogluj to dla Windows lub jak utworzyć zip z wiersza poleceń
Ashutosh Jha
20

Sprawdź, czy nazwa pliku i nazwa programu obsługi są takie same:

W tym przypadku spodziewamy się, że cały nasz kod będzie w pliku <code> bundle.ls </code>

Oznacza to, że zipplik ma bundle.jsplik eksportujący handlerfunkcję:

exports.handler = (event, context, callback) => {//...}
zooblin
źródło
4

W moim przypadku było tak, ponieważ miałem plik obsługi w wewnętrznym katalogu src.

Musiałem zmienić właściwość „Handler” w Lambdzie z:

index.handler

do

src/index.handler
Pete
źródło
Ja też do tego wpadłem; [Windows] po prostu klikałem prawym przyciskiem myszy APIczęść mojego repozytorium i używałem Send To > Compressed Folder. To tworzy zamek ze strukturą api/etc, stąd wyjątek!
C Bauer
3

Prawdopodobnie jest to problem z uprawnieniami do plików w pliku ZIP wdrożenia. Wypróbuj chmod 777pliki przed zapakowaniem ich w plik zip.

spg
źródło
2
Niestety, wydaje się, że to nie rozwiązuje problemu. Próbowałem skompresować planyrfolder w innym folderze bezskutecznie. Nazwa mojego programu obsługi i nazwy głównych plików JavaScript są zgodne ( index).
Anthony Krivonos,
chmod 777to zła rada ... to jest publiczne udostępnienie uprawnień do zapisu, odczytu i wykonywania. Zawsze znajdź przyczynę problemu z trasą. Zawsze staraj się zrozumieć implikacje bezpieczeństwa wynikające z wykonywania czegokolwiek, co ktoś w internecie poleci ci zrobić. Bezpieczeństwo jest ważne i domyślnie musi znajdować się w naszym kodzie.
Exadra37
3

W moim przypadku archiwum zawierało folder "src" z plikiem index.js, więc musiałem wstawić do handlera: "src / index.handler"

wprowadź opis obrazu tutaj

Sergey Smolnikov
źródło
0

W moim przypadku musiałem wymienić

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

z

exports.handler = function (event, context, callback) {
ianaz
źródło
0

Otrzymałem ten błąd, gdy używałem lambci/lambda:nodejs8.10w systemie Windows.

Wypróbowałem wszystkie wymienione powyżej rozwiązania, ale żadne z nich nie pomogło mi rozwiązać mojego problemu (mimo że stos błędów wygląda tak samo jak pytanie).

Oto moje proste rozwiązanie:

  1. za pomocą --entrypoint flagi do uruchomienia kontenera, aby dowiedzieć się, czy plik jest zamontowany w kontenerze. Okazuje się, że mogę mieć problem z udostępnionym dyskiem na moim pulpicie Docker.
  2. Dzień wcześniej zmieniłem demona dockera, ale wszystko działa dobrze, z wyjątkiem tego problemu.
  3. W każdym razie, ponownie podłącz mój dysk do Docker Desktop, możesz zarówno użyć dockerpolecenia, jak i po prostu otworzyć ustawienie Docker Desktop, aby zastosować.
James
źródło
0

W moim przypadku było to spowodowane brakiem pamięci w Node. Naprawiłem to, dodając --memory-size 1500do mojego aws lambda create-function ...polecenia.

Samuli Pahaoja
źródło