Error de AWS Lambda: "No se puede encontrar el módulo '/ var / task / index'"

87

Problema de tarea de Node.js Alexa

Actualmente estoy codificando una tarea Node.js Alexa a través de AWS Lambda, y he estado intentando codificar una función que recibe información de la API de OpenWeather y la analiza en una variable llamada weather. El código relevante es el siguiente:

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

Ejecuté este fragmento innumerables veces en Cloud9 y otros IDE, y parece que funciona perfectamente. Sin embargo, cuando lo comprimo en un paquete y lo subo a AWS Lambda, aparece el siguiente error:

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

Revisé innumerables artículos e instalé module-js, request y muchos otros módulos de Node que deberían hacer que este código se ejecute, pero nada parece solucionar este problema. Aquí está mi directorio, por si acaso:

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

¿Alguien sabe cuál podría ser el problema? Muchas gracias de antemano.

Anthony Krivonos
fuente
Aquí está la salida de registro para mi 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
Además de la respuesta sobre comprimir usando la terminal en una Mac, también asegúrese de que su archivo de código se llame 'index.js'. El mío tenía un nombre más descriptivo, generando el error.
Art
1
@Art Este era mi problema. Subí la cremallera de un test.js y arrojó un error no controlado. Después de cambiarlo a index.js funcionó bien. Gracias.
Hudspeth

Respuestas:

229

¡Arreglado! Mi problema fue que intenté comprimir el archivo usando la función de compresión incorporada de mi Mac en Finder.

Si usted es un usuario de Mac, como yo, se debe ejecutar la siguiente secuencia de comandos en el terminal cuando se encuentra en el directorio raíz del proyecto (carpeta que contiene index.js, node_modules, etc. archivos).

zip -r ../yourfilename.zip *

Para ventanas:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Anthony Krivonos
fuente
7
Estaba comprimiendo así: "zip -r carpeta folder.zip" y, por supuesto, esto falló. gracias por el consejo de simplemente comprimir los archivos y no el directorio
Dane Macaulay
6
¿Qué hay de las ventanas?
Alok Rajasukumaran
también asegúrese de nombrar la funciónindex.js
Conocimiento
¿Hay alguna forma de hacer esto desde fuera del directorio?
andrhamm
1
@andrhamm Sí. El formato es zip -r /path/to/destination.zip /path/to/source/directory/*. Eso comprime el contenido del directorio. Si también desea comprimir el directorio en sí, use / ruta / a / fuente / directorio sin el *.
Qaz
23

Actualizar a la respuesta aceptada: cuando se produce este error, significa que su archivo zip no tiene el formato válido que requiere AWS.

Si hace doble clic en zip, encontrará su carpeta dentro de su archivo de código, pero lambda quiere que cuando haga doble clic en zip, muestre los archivos de código directo.

Lograr esto:

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

Luego, cárguelo index.zipen AWS Lambda.

Ashutosh Jha
fuente
en Windows git bast arrojando el error "comando no encontrado", ¿cómo resolver esto alguna idea?
Pardeep Jain
1
Este es el comando de Ubuntu, busque en Google para Windows o cómo crear un archivo zip desde el símbolo del sistema
Ashutosh Jha
20

Compruebe que el nombre del archivo y el nombre del controlador sean los mismos:

En este caso, esperamos que todo nuestro código esté en el archivo <code> bundle.ls </code>

Eso significa que el ziparchivo tiene un bundle.jsarchivo que exporta la handlerfunción:

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

En mi caso, fue porque tenía el archivo del controlador en el directorio src interno.

Tuve que cambiar la propiedad 'Handler' dentro de Lambda de:

index.handler

a

src/index.handler
Pete
fuente
También me encontré con esto; [Windows] era simplemente que estaba haciendo clic derecho en la APIparte de mi repositorio y usando Send To > Compressed Folder. Esto crea un zip con estructura api/etc, ¡de ahí la excepción!
C Bauer
3

Probablemente se trate de un problema de permisos con archivos dentro de su zip de implementación. Pruebe chmod 777sus archivos antes de empaquetarlos en un archivo zip.

spg
fuente
2
Desafortunadamente, eso no parece solucionar el problema. Intenté comprimir la planyrcarpeta dentro de otra carpeta sin éxito. El nombre de mi controlador y los nombres de los archivos JavaScript principales coinciden ( index).
Anthony Krivonos
chmod 777Es un mal consejo ... esto es abrir permisos al público para escribir, leer y ejecutar. Busque siempre la ruta que causa el problema. Siempre intente comprender las implicaciones de seguridad de ejecutar cualquier cosa que alguien en Internet le diga que haga. La seguridad es importante y debe estar en nuestro código por defecto.
Exadra37
3

En mi caso, el archivo contenía una carpeta "src" con el archivo index.js, así que tuve que poner en el controlador: "src / index.handler"

ingrese la descripción de la imagen aquí

Sergey Smolnikov
fuente
0

En mi caso tuve que reemplazar

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

con

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

Recibí este error cuando estaba usando lambci/lambda:nodejs8.10Windows.

Probé todas las soluciones enumeradas anteriormente, pero ninguna de las cuales pudo ayudarme a resolver mi problema (aunque la pila de errores se ve igual que la pregunta).

Aquí está mi solución simple:

  1. utilizando --entrypoint flag para ejecutar un contenedor para averiguar si el archivo está montado en el contenedor. Resulta que puedo tener el problema de la unidad compartida con mi Docker Desktop.
  2. Cambié mi demonio de la ventana acoplable ese día antes, pero todo funciona bien excepto este problema.
  3. De todos modos, vuelva a montar mi unidad en Docker Desktop, ambos pueden usar el dockercomando o simplemente abrir la configuración de Docker Desktop para aplicar.
James
fuente
0

En mi caso, esto se debió a que Node se quedó sin memoria. Lo arreglé agregando --memory-size 1500a mi aws lambda create-function ...comando.

Samuli Pahaoja
fuente