Erro AWS Lambda: “Não é possível encontrar o módulo '/ var / task / index'”

87

Problema de tarefa Alexa em Node.js

Atualmente, estou codificando uma tarefa Alexa em Node.js por meio do AWS Lambda e venho tentando codificar uma função que recebe informações da API OpenWeather e as analisa em uma variável chamada weather. O código relevante é o seguinte:

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

Eu executei este snippet inúmeras vezes no Cloud9 e em outros IDEs, e parece estar funcionando perfeitamente. No entanto, ao compactar em um pacote e carregá-lo no AWS Lambda, recebo o seguinte erro:

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

Eu vasculhei incontáveis ​​artigos e instalei module-js, request e muitos outros módulos do Node que deveriam fazer este código rodar, mas nada parece resolver esse problema. Aqui está meu diretório, apenas no caso:

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

Alguém sabe qual pode ser o problema? Muito obrigado antecipadamente.

Anthony Krivonos
fonte
Aqui está a saída de log do meu código: 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
Além da resposta sobre compactação usando o terminal em um Mac, certifique-se também de que seu arquivo de código é chamado de 'index.js'. O meu tinha um nome mais descritivo, gerando o erro.
Art
1
@Art Este era o meu problema. Eu fechei um test.js e gerou um erro não tratado. Depois de alterá-lo para index.js, funcionou bem. Obrigado.
Hudspeth

Respostas:

229

Corrigido! Meu problema foi que tentei compactar o arquivo usando a função de compactação embutida do meu Mac no Finder.

Se você é um usuário de Mac, como eu, você deve executar o seguinte script no terminal quando você está no diretório raiz do seu projeto (pasta que contém seus index.js, node_modules, etc arquivos).

zip -r ../yourfilename.zip *

Para Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Anthony Krivonos
fonte
7
Eu estava compactando assim: "zip -r folder folder.zip" e é claro que isso falhou. obrigado pela dica de apenas compactar os arquivos e não o diretório
Dane Macaulay
6
Que tal janelas?
Alok Rajasukumaran
também certifique-se de nomear a função index.js
Conhecimento
Existe alguma maneira de fazer isso de fora do diretório?
andrhamm
1
@andrhamm Sim. O formato é zip -r /path/to/destination.zip /path/to/source/directory/*. Isso compacta o conteúdo do diretório. Se você deseja compactar o próprio diretório também, use / path / para / source / diretório sem o *.
Qaz
23

Atualize para a resposta aceita: Quando esse erro ocorre, significa que seu arquivo zip não está no formato válido que a AWS exige.

Se você clicar duas vezes no zip, encontrará sua pasta dentro do seu arquivo de código, mas lambda quer isso quando você clicar duas vezes no zip, ele deve mostrar os arquivos de código direto.

Para alcançar isto:

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

Em seguida, carregue index.zipno AWS Lambda.

Ashutosh Jha
fonte
no windows git bast jogando o erro "command not found", como resolver isso alguma idéia?
Pardeep Jain
1
Este é o comando do Ubuntu, por favor, google para windows ou como criar zip a partir do prompt de comando
Ashutosh Jha
20

Verifique se o nome do arquivo e o nome do manipulador são iguais:

Neste caso, esperamos que todo o nosso código esteja no arquivo <code> bundle.ls </code>

Isso significa que esse ziparquivo possui um bundle.jsarquivo que exporta a handlerfunção:

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

No meu caso, foi porque eu tinha o arquivo manipulador no diretório interno src.

Tive que alterar a propriedade 'Handler' no Lambda de:

index.handler

para

src/index.handler
Pete
fonte
Eu também corri para isso; [Windows] era simplesmente que eu estava clicando com o botão direito na APIparte do meu repositório e usando Send To > Compressed Folder. Isso cria um zip com estrutura api/etc, daí a exceção!
C Bauer
3

Este é provavelmente um problema de permissão com arquivos dentro de seu zip de implantação. Teste chmod 777seus arquivos antes de compactá-los em um arquivo zip.

spg
fonte
2
Infelizmente, isso não parece resolver o problema. Tentei compactar a planyrpasta em outra pasta, sem sucesso. Meu nome de manipulador e os nomes dos arquivos principais do JavaScript correspondem ( index).
Anthony Krivonos de
chmod 777é um conselho ruim ... isso é abrir as permissões para o público escrever, ler e executar. Sempre encontre a causa do problema. Sempre tente entender as implicações de segurança de executar qualquer coisa que alguém na Internet diga para você fazer. A segurança é importante e deve estar em nosso código por padrão.
Exadra37 de
3

No meu caso, o arquivo continha uma pasta "src" com o arquivo index.js, então tive que colocar para o manipulador: "src / index.handler"

insira a descrição da imagem aqui

Sergey Smolnikov
fonte
0

No meu caso tive que substituir

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

com

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

Recebi este erro quando estava usando lambci/lambda:nodejs8.10no windows.

Eu tentei todas as soluções listadas acima, mas nenhuma delas poderia me ajudar a lidar com meu problema (embora a pilha de erros pareça a mesma da pergunta).

Aqui está minha solução simples:

  1. usando --entrypoint sinalizador para executar um contêiner para descobrir se o arquivo está montado no contêiner. Acontece que posso ter o problema de compartilhamento de unidade com meu Docker Desktop.
  2. Troquei meu daemon docker naquele dia antes, mas tudo funciona bem, exceto este problema.
  3. De qualquer forma, remonte minha unidade no Docker Desktop, você pode usar o dockercomando ou apenas abrir a configuração do Docker Desktop para aplicar.
James
fonte
0

No meu caso, isso foi causado por Node ficando sem memória. Consertei isso adicionando --memory-size 1500ao meu aws lambda create-function ...comando.

Samuli Pahaoja
fonte