AWS Lambda Hatası: "'/ var / task / index' modülü bulunamıyor"


87

Node.js Alexa Görev Sorunu

Şu anda AWS Lambda aracılığıyla bir Node.js Alexa Görevini kodluyorum ve OpenWeather API'den bilgi alan ve bunu adlı bir değişkene ayrıştıran bir işlevi kodlamaya çalışıyorum weather. İlgili kod aşağıdaki gibidir:

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

Bu pasajı Cloud9 ve diğer IDE'lerde sayısız kez çalıştırdım ve kusursuz çalışıyor gibi görünüyor. Ancak, onu bir pakete sıkıştırıp AWS Lambda'ya yüklediğimde aşağıdaki hatayı alıyorum:

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

Sayısız makaleyi inceledim ve bu kodu çalıştırması gereken modül-js, istek ve diğer birçok Node modülü yükledim, ancak hiçbir şey bu sorunu çözecek gibi görünmüyor. İşte rehberim, her ihtimale karşı:

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

Sorunun ne olabileceğini bilen var mı? Şimdiden çok teşekkür ederim.


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
Kodum

3
Mac'te terminal kullanarak sıkıştırmayla ilgili cevaba ek olarak, kod dosyanızın "index.js" olarak adlandırıldığından emin olun. Benimkinin hatayı oluşturan daha açıklayıcı bir adı vardı.
Sanat

1
@Art Bu benim sorunumdu. Bir test.js dosyasını sıkıştırdım ve işlenmemiş bir hata verdi. Bunu index.js olarak değiştirdikten sonra iyi çalıştı. Teşekkürler.
Hudspeth

Yanıtlar:


229

Onu düzeltti! Sorunum, dosyayı Finder'da Mac'imin yerleşik sıkıştırma işlevini kullanarak sıkıştırmaya çalışmamdı.

Mac kullanıcısıysanız (sizin içeren klasörü projenizin kök dizininde olduğunda, benim gibi, terminal içinde aşağıdaki komut dosyasını çalıştırmalısınız index.js, node_modulesvb dosyaları).

zip -r ../yourfilename.zip *

Pencereler için:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip

7
şu şekilde sıkıştırıyordum: "zip -r klasör klasör.zip" ve tabii ki bu başarısız oldu. dizini değil dosyaları sıkıştırmak için ipucu için teşekkürler
Dane Macaulay

6
Peki ya pencereler?
Alok Rajasukumaran

işlevi adlandırdığınızdan da emin olunindex.js
Knowledge

Bunu dizinin dışından yapmanın bir yolu var mı?
andrhamm

1
@andrhamm Evet. Biçim zip -r /path/to/destination.zip /path/to/source/directory/*. Bu, dizinin içeriğini sıkıştırır. Dizinin kendisini de ziplemek istiyorsanız, * olmadan / kaynak / dizine / yol / dizinini kullanın.
Qaz

23

Kabul edilen yanıta güncelleme: Bu hata oluştuğunda bu, zip dosyanızın AWS'nin gerektirdiği geçerli biçimde olmadığı anlamına gelir.

Zip'e çift tıklarsanız, klasörünüzü kod dosyanızın içinde bulacaksınız, ancak lambda zip'e çift tıkladığınızda doğrudan kod dosyalarını göstermesini istiyor.

Bunu başarmak için:

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

Ardından index.zipAWS Lambda'ya yükleyin .


Windows'ta git bast atma hatası "komut bulunamadı", bunu nasıl çözebilirim?
Pardeep Jain

1
Bu Ubuntu'nun komutudur, lütfen pencereler için google veya komut isteminden nasıl zip oluşturulur
Ashutosh Jha

20

Dosya adının ve işleyici adının aynı olduğunu kontrol edin:

Bu durumda, tüm kodumuzun <code> bundle.ls </code> dosyasında olmasını bekliyoruz

Bu zip, bundle.jsdosyanın handlerişlevi dışa aktaran dosyaya sahip olduğu anlamına gelir :

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

4

Benim durumumda bunun nedeni işleyici dosyamın iç src dizininde olmasıydı.

Lambda'daki 'İşleyici' özelliğini şundan değiştirmem gerekiyordu:

index.handler

-e

src/index.handler

Ben de buna rastladım; [Windows] basitçe depomun üzerine sağ tıklıyordum APIve kullanıyordum Send To > Compressed Folder. Bu, yapıya sahip bir fermuar oluşturur api/etc, bu nedenle istisna!
C Bauer

3

Bu muhtemelen dağıtım zip dosyanızın içindeki dosyalarla ilgili bir izin sorunudur. chmod 777Bir zip dosyasında paketlemeden önce dosyalarınızı deneyin .


2
Maalesef bu sorunu çözmüyor gibi görünüyor. planyrKlasörü başka bir klasörde boşuna sıkıştırmayı denedim . İşleyicim ve ana JavaScript dosya adlarım eşleşiyor ( index).
Anthony Krivonos

chmod 777kötü bir tavsiye ... bu halka yazma, okuma ve yürütme izni açmaktır. Lütfen her zaman sorunun nedenini bulun. Her zaman internetteki birisinin size söylediği şeyi yürütmenin güvenlik sonuçlarını anlamaya çalışın. Güvenlik önemlidir ve varsayılan olarak kodumuzda olmalıdır.
Exadra37

3

Benim durumumda arşiv, index.js dosyasını içeren bir "src" klasörü içeriyordu, bu yüzden işleyiciye "src / index.handler" koymam gerekti.

görüntü açıklamasını buraya girin


0

Benim durumumda değiştirmek zorunda kaldım

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

ile

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

0

Bu hatayı kullanırken aldım lambci/lambda:nodejs8.10Windows .

Yukarıda listelenen tüm çözümleri denedim, ancak hiçbiri sorunumla başa çıkmama yardımcı olamadı (hata yığını soruyla aynı görünse de).

İşte benim basit çözümüm:

  1. --entrypointdosyanın konteynere monte edilip edilmediğini öğrenmek için bir konteyneri çalıştırmak için flag kullanmak . Docker Desktop'ımda paylaşım sürücüsü sorununu yaşadığım ortaya çıktı.
  2. Docker daemon'umu o gün önce değiştirdim, ancak bu sorun dışında her şey yolunda gidiyor.
  3. Her neyse, sürücümü Docker Desktop'a yeniden bağlayın, hem dockerkomutu kullanabilir hem de uygulamak için Docker Desktop ayarını açabilirsiniz.

0

Benim durumumda bu, Node'un belleğin bitmesinden kaynaklanıyordu. Ben ekleyerek o sabit --memory-size 1500benim için aws lambda create-function ...komuta.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.