AWS Lambdaエラー:「モジュール '/ var / task / index'が見つかりません」


87

Node.js Alexaタスクの問題

現在、AWS Lambdaを介してNode.js Alexa Taskをコーディングしています。OpenWeatherAPIから情報を受け取り、それをと呼ばれる変数に解析する関数をコーディングしようとしていますweather。関連するコードは次のとおりです。

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

このスニペットをCloud9や他のIDEで何度も実行しましたが、問題なく動作しているようです。ただし、パッケージに圧縮してAWS Lambdaにアップロードすると、次のエラーが発生します。

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

私は無数の記事を精査し、このコードを実行する必要があるmodule-js、request、および他の多くのNodeモジュールをインストールしましたが、この問題を修正するものは何もないようです。これは念のため私のディレクトリです:

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

誰かが問題が何であるかを知っていますか?よろしくお願いします。


ここに私のコードのログ出力がある: 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
アンソニーKrivonos

3
Macのターミナルを使用した圧縮に関する回答に加えて、コードファイルが「index.js」と呼ばれていることも確認してください。鉱山にはより説明的な名前があり、エラーが発生しました。
アート

1
@Artこれは私の問題でした。test.jsを圧縮したところ、未処理のエラーが発生しました。index.jsに変更した後、問題なく動作しました。ありがとう。
Hudspeth

回答:


229

直した!私の問題は、FinderにMacの組み込み圧縮機能を使用してファイルを圧縮しようとしたことでした。

あなたがMacユーザーであれば、あなたのプロジェクトのルートディレクトリにあるときに、私のように、あなたは(あなたの入っているフォルダの端末で次のスクリプトを実行する必要がありindex.jsnode_modulesなどのファイルを)。

zip -r ../yourfilename.zip *

Windowsの場合:

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

7
「zip -r folder folder.zip」のように圧縮していましたが、もちろんこれは失敗しました。ディレクトリではなくファイルを圧縮するだけのヒントに感謝します
Dane Macaulay

6
窓はどうですか?
Alok Rajasukumaran 2017

また、関数に名前を付けてくださいindex.js
ナレッジ

ディレクトリの外からこれを行う方法はありますか?
andrhamm 2017

1
@andrhammはい。形式はzip -r /path/to/destination.zip /path/to/source/directory/*です。これにより、ディレクトリの内容が圧縮されます。ディレクトリ自体も圧縮したい場合は、*なしで/ path / to / source / directoryを使用します。
Qaz 2017

23

承認された回答の更新:このエラーが発生した場合、AWSが必要とする有効な形式にzipファイルが含まれていないことを意味します。

zipをダブルクリックすると、コードファイル内にフォルダーが見つかりますが、lambdaは、zipをダブルクリックしたときに、直接コードファイルを表示することを求めています。

これを達成するには:

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

次に、index.zipAWS Lambda にアップロードします。


Windows git bastでエラー「コマンドが見つかりません」をスローする場合、これを解決するにはどうすればよいですか?
Pardeep Jain 2017

1
これはUbuntuのコマンドです。Windowsの場合はグーグルで実行するか、コマンドプロンプトからzipを作成する方法
Ashutosh Jha

20

ファイル名とハンドラー名が同じであることを確認します。

この場合、すべてのコードが<code> bundle.ls </ code>ファイルにあると想定しています

つまり、zipファイルには関数bundle.jsをエクスポートhandlerするファイルがあります。

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

4

私の場合、内部のsrcディレクトリにハンドラファイルがあったためです。

Lambda内の 'Handler'プロパティを以下から変更する必要がありました。

index.handler

src/index.handler

私もこれに遭遇しました。[Windows] APIリポジトリの一部を右クリックしてを使用しただけSend To > Compressed Folderでした。これは構造を持つzipを作成するapi/etcため、例外です!
C Bauer

3

これは、おそらくデプロイメントzip内のファイルに関する権限の問題です。chmod 777zipファイルにパッケージ化する前に、ファイルを試してください。


2
残念ながら、それでも問題は解決しないようです。planyr別のフォルダ内のフォルダを圧縮して無益にしようとしました。ハンドラ名とメインのJavaScriptファイル名が一致します(index)。
Anthony Krivonos 2017年

chmod 777悪いアドバイスです...これは、書き込み、読み取り、実行の許可を一般に公開しています。問題のルート原因を常に見つけてください。インターネット上の誰かがあなたに行うように言ったことを実行することのセキュリティへの影響を常に理解するようにしてください。セキュリティは重要であり、デフォルトでコードに含まれている必要があります。
Exadra37

3

私の場合、アーカイブにはindex.jsファイルを含むフォルダー「src」が含まれていたため、ハンドラーに「src / index.handler」を配置する必要がありました。

ここに画像の説明を入力してください


0

私の場合、交換する必要がありました

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

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

0

lambci/lambda:nodejs8.10Windows で使用していたときにこのエラーが発生しました。

上記のすべての解決策を試しましたが、エラースタックが質問と同じように見えても、どれも私の問題に対処するのに役立ちませんでした。

これが私の簡単な解決策です:

  1. --entrypointフラグを使用してコンテナを実行し、ファイルがコンテナにマウントされているかどうかを確認します。Dockerデスクトップで共有ドライブの問題が発生する可能性があることがわかりました。
  2. その前日にドッカーデーモンを切り替えましたが、この問題以外はすべて正常に機能します。
  3. とにかく、ドライブをDockerデスクトップに再マウントdockerします。どちらもコマンドを使用することも、Dockerデスクトップ設定を開いて適用することもできます。

0

私の場合、これはノードのメモリ不足が原因でした。コマンドに追加--memory-size 1500して修正しましたaws lambda create-function ...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.