Recibo los errores «Cannot find module» o «Cannot find Package» cuando ejecuto el código de AWS Lambda en Node.js.
Descripción breve
Si el entorno Lambda no encuentra la biblioteca especificada en el código Node.js, recibirás uno de estos errores. Estos errores se producen porque Lambda no viene preempaquetada con todas las bibliotecas de Node.js.
Si falta un módulo en CommonJS, recibirás el siguiente error: Runtime.ImportModuleError: Error: Cannot find module.
Si falta un módulo en JavaScript ES6, recibirás el siguiente error: Error [ERR_MODULE_NOT_FOUND]: Cannot find package.
Resolución
Para resolver estos errores, crea un paquete de despliegue o una capa de Lambda que incluya las bibliotecas que desees utilizar en el código Node.js.
Para los entornos de ejecución de Node.js 16 y versiones anteriores, Lambda no admite las dependencias del módulo ES de JavaScript en capas. Debes incluir las dependencias en el despliegue. Lambda admite las dependencias del módulo ES de JavaScript para Node.js 20.
Crea una capa de Lambda, en lugar de un paquete de despliegue, para poder reutilizar la capa en varias funciones de Lambda. Cada versión ejecutable de Lambda agrega carpetas específicas del directorio /opt a la variable PATH. Si la capa usa la misma estructura de carpetas, el código de la función de Lambda puede acceder al contenido de la capa sin una ruta específica.
Importante: La biblioteca que se importe a Node.js debe estar dentro de la estructura de carpetas nodejs/node_modules.
Se recomienda crear una capa de Lambda en el mismo sistema operativo (SO) en el que se basa la versión ejecutable de Lambda. Por ejemplo, las versiones más recientes de Node.js se basan en imágenes de máquina de Amazon (AMI) de Amazon Linux 2023.
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Para crear una capa de Lambda para una biblioteca de Node.js, sigue estos pasos:
-
Crea una instancia de Amazon Elastic Compute Cloud (Amazon EC2) a partir de una AMI de Amazon Linux 2.
-
Crea un rol de AWS Identity and Access Management (IAM) con permisos para llamar a la API publish-layer-version.
-
Adjunta el rol de IAM a la instancia de Amazon EC2.
Nota: La instancia de EC2 ahora tendrá permisos para cargar capas de Lambda durante la llamada a la API publish-layer-version.
-
Usa SSH para conectarte a tu instancia de EC2.
-
Instala Node.js:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh
nvm install node
-
Crea una carpeta nodejs:
mkdir nodejs
-
Instala la biblioteca aws-xray-sdk en la carpeta nodejs:
cd nodejs$ npm init ***answer all queries for initialization that create a package.json file***
npm install --save aws-xray-sdk
Nota: Sustituye la biblioteca de ejemplos aws-xray-sdk por la biblioteca Node.js que desees importar.
-
Crea un archivo zip para la biblioteca aws-xray-sdk:
zip -r layer.zip nodejs
Nota: La biblioteca aws-xray-sdk tiene el formato de carpeta necesario para una capa de Node.js: nodejs/node_modules.
-
Para publicar la capa de Lambda, ejecuta el siguiente comando publish-layer-version:
aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region your-region
Nota: Sustituye your-region por tu región de AWS.
Para agregar los módulos ECMAScript 6 (ES6) o CommonJS al código, consulta la sintaxis JavaScript ES6/CommonJS.
Información relacionada
¿Cómo soluciono los errores «permission denied» o «unable to import module» al cargar un paquete de despliegue de Lambda?
¿Cómo puedo crear un paquete de despliegue de Lambda para Node.js?