javascript - tutorial - lambda console
aws-lambda no se puede encontrar el modulo (12)
AWS Lambda usa el nombre del archivo y el nombre de la función de controlador, por lo que si definió su controlador de esta manera: exports.myHandler = function(event, context)
en un archivo llamado index.js
, su controlador es index.myHandler
.
Sigo recibiendo este error en la consola aws-lambda al cargar código desde un archivo zip. He intentado subir otros archivos zip y funcionan correctamente. El archivo .js se llama "CreateThumbnail.js" en el archivo zip. Creo que el controlador también se llama correctamente "CreateThumbnail.handler". El subdirectorio node_modules también está configurado. ¿Alguien tiene alguna idea?
{
"errorMessage": "Cannot find module ''CreateThumbnail''",
"errorType": "Error",
"stackTrace": [
"Function.Module._resolveFilename (module.js:338:15)",
"Function.Module._load (module.js:280:25)",
"Module.require (module.js:364:17)",
"require (module.js:380:17)"
]
}
El tutorial le indica que incluya los siguientes elementos en su archivo zip:
CrearThumbnail.js
/ node_modules / gm
/ node_modules / async
Lo que no tiene en cuenta es que hay dependencias de los dos paquetes (gm, async) que también deben ser parte del paquete.
Así que esto es lo que tienes que hacer:
- Cambie el directorio a la carpeta node_modules en su carpeta de proyecto y ejecute el comando '' npm install gm async ''. Esto instalará gm, async y todas sus dependencias en esta carpeta.
- Ahora empaquete el archivo ''CreateThumbnail.js'' y la carpeta completa ''node_modules'' en un archivo zip y cárguelo. Debería funcionar ahora.
Por lo tanto, su paquete completo debe verse algo como esto:
CreateThumbnail.js
/node_modules/.bin
/node_modules/array-parallel
/node_modules/array-series
/node_modules/async
/node_modules/cross-spawn
/node_modules/debug
/node_modules/gm
/node_modules/isexe
/node_modules/lodash
/node_modules/lru-cache
/node_modules/ms
/node_modules/pseudomap
/node_modules/which
/node_modules/yallist
Es posible que algunos archivos de la biblioteca no tengan una lectura global, por lo que lambda no podrá leer el contenido y crear el contenido.
Asegúrese de que todos los archivos en node_modules
sean legibles antes de empaquetar:
chmod -R +r node_modules
Luego zip y subir.
Este error exacto puede aparecer si sus archivos comprimidos no tienen permiso de lectura en todo el mundo. ( chmod -R ugo+r
).
Verifique los permisos de archivo antes de que estén comprimidos. Esto no se enfatiza, pero lamentablemente por AWS y causó muchos dolores de cabeza a muchos.
Esto no está relacionado pero Google me trajo aquí, así que:
AWS le dará un error:
Unable to import module ''<myfile>'': Error
Lo que realmente me estaba sucediendo era que se necesitaba un archivo JS inexistente. El error es un poco engañoso.
Esto resultó ser simple para mí.
Estaba recibiendo, no se puede crear índice. en mi caso, mi archivo lambda principal con el export.handler en tenía que ser llamado index.js
Intente llamar a su archivo principal CreateThumbnail.js
La forma en que pude hacer que esto funcionara fue:
- Nombra el archivo exports.js
- Nombre el controlador, dentro del archivo, exports.handler
- Establezca el controlador en la configuración lambda a exports.handler
- Comprima solo el contenido de la carpeta, no la carpeta en sí (como se mencionó anteriormente) y cambie el nombre del archivo zip exports.zip
Ok, lo hice yo mismo, solo asegúrate de hacer el archivo zip de manera que el archivo .js no termine dentro de una carpeta, porque AWS descomprimiría el archivo que subiste e intentará encontrar un archivo .js con el nombre de manejador que dio, y si está dentro de una carpeta no le ayudará.
Si está utilizando capas Lambda de AWS , necesita validar si su estructura de directorios está en la estructura necesaria para una capa:
Por ejemplo, para el módulo moment.js node.js necesita la siguiente estructura:
aws-lambda-layer.zip
│ nodejs
│ nodejs/node_modules
└ nodejs/node_modules/moment
Entonces, para crear un archivo zip de capa con la estructura correcta, podemos usar el siguiente comando en la raíz de nuestro proyecto:
mkdir -p nodejs && cp -r node_modules nodejs/ && zip -r aws-lambda-layer.zip nodejs
Tuve este problema en un módulo personalizado que había construido que estaba en el directorio node_modules. Todo funcionó bien en las pruebas en mi máquina Win10, pero cuando lo cargué seguí recibiendo el mismo error "No se puede encontrar el módulo ''nombre de módulo''".
Resulta que tuve un desajuste; Aquí está la línea package.json del módulo que no se pudo encontrar:
"main": "./build/modulename.js",
y aquí está el nombre de archivo real:
Modulename.js
Distingue mayúsculas y minúsculas; Windows no es, Linux (y por lo tanto AWS) es.
Un posible problema es si carga la lambda como un archivo zip creado a través de PowerShell Compress-Archive
. Compress-Archive
tiene un error que hace que AWS extraiga los archivos en un árbol plano (sin subdirectorios), con barras invertidas en los nombres de archivo:
Nombre del archivo:
app.js
Función Lambda en "app.js":
exports.handler = función (evento, contexto) ...
Controlador de Lambda en la consola de Amazon:
app.handler ( {app} .js + exports. {handler} = app.handler )
Cuando descomprimas la carpeta, deberías ver:
app.js
nodo_módulos