Ошибка AWS Lambda: «Не удается найти модуль '/ var / task / index'»

87

Проблема с задачей Node.js Alexa

В настоящее время я кодирую задачу Node.js Alexa с помощью AWS Lambda, и я пытался кодировать функцию, которая получает информацию от OpenWeather API и анализирует ее в переменной с именем 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
Энтони Кривонос
3
В дополнение к ответу о архивировании с помощью терминала на Mac также убедитесь, что ваш кодовый файл называется index.js. У меня было более информативное имя, что приводило к ошибке.
Art
1
@Art Это была моя проблема. Я заархивировал test.js, и он выдал необработанную ошибку. После изменения на index.js он работал нормально. Спасибо.
Хадспет

Ответы:

229

Починил это! Моя проблема заключалась в том, что я пытался заархивировать файл, используя встроенную функцию сжатия моего Mac в Finder.

Если вы пользователь Mac, как я, вы должны выполнить следующий скрипт в терминале , когда вы находитесь в корневой директории вашего проекта (папка , содержащих ваши index.js, node_modulesи т.д. файлы).

zip -r ../yourfilename.zip *

Для Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Энтони Кривонос
источник
7
я архивировал так: «zip -r folder folder.zip» и, конечно, это не удалось. спасибо за совет, чтобы просто заархивировать файлы, а не каталог
Дейн Маколей
6
Как насчет окон?
Алок Раджасукумаран
также не забудьте назвать функциюindex.js
Знание
Есть ли способ сделать это вне каталога?
andrhamm 07
1
@andrhamm Да. Формат такой zip -r /path/to/destination.zip /path/to/source/directory/*. Это заархивирует содержимое каталога. Если вы хотите заархивировать и сам каталог, используйте / path / to / source / directory без *.
Qaz
23

Обновите принятый ответ: когда возникает эта ошибка, это означает, что ваш zip-файл имеет неправильную форму, которая требуется AWS.

Если вы дважды щелкните zip, вы найдете свою папку внутри этого файла кода, но лямбда хочет, чтобы при двойном щелчке на zip-архиве отображались файлы прямого кода.

Для достижения этой цели:

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

Затем загрузите index.zipв AWS Lambda.

Ашутош Джа
источник
в windows git bast ошибка бросания "команда не найдена", как решить эту проблему?
Pardeep Jain
1
Это команда Ubuntu, пожалуйста, погуглите ее для Windows или как создать zip из командной строки
Ашутош Джа,
20

Убедитесь, что имя файла и имя обработчика совпадают:

В этом случае мы ожидаем, что весь наш код будет в файле <code> bundle.ls </code>.

Это означает, что в этом zipфайле есть bundle.jsфайл, который экспортирует handlerфункцию:

exports.handler = (event, context, callback) => {//...}
зооблин
источник
4

В моем случае это было потому, что у меня был файл обработчика во внутреннем каталоге src.

Мне пришлось изменить свойство Handler в Lambda с:

index.handler

к

src/index.handler
Пит
источник
Я тоже столкнулся с этим; [Windows] просто я щелкнул правой кнопкой мыши APIчасть своего репо и использовал Send To > Compressed Folder. Это создает zip со структурой api/etc, следовательно, исключение!
C Bauer
3

Вероятно, это проблема с правами доступа к файлам внутри zip развертывания. Попробуйте chmod 777свои файлы, прежде чем упаковывать их в zip-файл.

spg
источник
2
К сожалению, это не решает проблему. Я planyrбезрезультатно пытался сжать папку в другой папке. Имя моего обработчика и имена основных файлов JavaScript совпадают ( index).
Энтони Кривонос
chmod 777это плохой совет ... это открытие разрешений на запись, чтение и выполнение. Всегда находите маршрут, по которому возникла проблема. Всегда старайтесь понять последствия для безопасности выполнения всего, что вам скажут в Интернете. Безопасность важна и по умолчанию должна быть в нашем коде.
Exadra37
3

В моем случае в архиве была папка «src» с файлом index.js, поэтому мне пришлось поставить в обработчик: «src / index.handler»

введите описание изображения здесь

Сергей Смольников
источник
0

В моем случае пришлось заменить

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

с участием

exports.handler = function (event, context, callback) {
Яназ
источник
0

Я получил эту ошибку, когда использовал lambci/lambda:nodejs8.10в Windows.

Я попробовал все решения, перечисленные выше, но ни одно из них не помогло мне решить мою проблему (хотя стек ошибок выглядит так же, как вопрос).

Вот мое простое решение:

  1. использование --entrypointфлага для запуска контейнера, чтобы узнать, смонтирован ли файл в контейнер. Оказывается, у меня может быть проблема с общим диском с моим Docker Desktop.
  2. В тот день я переключил демон докеров, но все работает нормально, кроме этой проблемы.
  3. В любом случае, перемонтируйте мой диск на Docker Desktop, вы можете использовать dockerкоманду или просто открыть настройку Docker Desktop, чтобы применить.
Джеймс
источник
0

В моем случае это было вызвано нехваткой памяти узлу. Я исправил это, добавив --memory-size 1500в свою aws lambda create-function ...команду.

Самули Пахаоджа
источник