¿Cómo cargar módulos npm en AWS Lambda?
Creé varias funciones Lambda usando el editor basado en web. Hasta ahora, todo bien. Ahora me gustaría comenzar a ampliarlos con módulos (como Q para promesas). No puedo entender cómo llevar los módulos a Lambda para que mis funciones puedan consumirlos.
Leí el uso de paquetes y módulos nativos de nodejs en AWS Lambda , pero parece implicar configurar un EC2 y ejecutar funciones Lambda desde allí. Existe un mecanismo para cargar un zip al crear una función, pero parece implicar el envío de funciones desarrolladas localmente. Dado que estoy trabajando en el editor basado en web, parece un flujo de trabajo extraño.
¿Cómo puedo implementar simplemente algunos módulos para usarlos en mis funciones Lambda?
No puede cargar módulos NPM sin cargar un .zip
archivo, pero puede reducir este proceso a dos líneas de comando rápidas.
Así es cómo:
Coloque sus archivos de función Lambda en un directorio separado. Esto se debe a que instala
npm
paquetes localmente para Lambda y desea poder aislar y probar lo que cargará en Lambda.Instale sus paquetes NPM localmente
npm install packageName
mientras se encuentra en su directorio Lambda separado que creó en el paso 1.Asegúrese de que su función funcione cuando se ejecuta localmente:
node lambdaFunc.js
(simplemente puede comentar las dosexport.handler
líneas en su código para adaptar su código para que se ejecute con Node localmente).Vaya al directorio de Lambda y comprima el contenido , asegúrese de no incluir el directorio en sí.
zip -r lambdaFunc.zip .
Si tienes
aws-cli
instalado, lo cual te sugiero tener si quieres hacerte la vida más fácil, ahora puedes ingresar este comando:aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip
(sin comillas en la parte anterior de lambdaFunc en caso de que te lo preguntes como yo)
Ahora puede hacer clic en probar en la consola Lambda.
Sugiero agregar un alias corto para los dos comandos anteriores. Esto es lo que tengo en el mío para el comando de actualización Lambda, mucho más largo:
alias up="aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip"
Se requiere un .zip
archivo para incluir módulos npm en Lambda. Y realmente no deberías usar el editor web Lambda para nada; como con cualquier código de producción, deberías desarrollar localmente, comprometerte con git, etc.
MI FLUJO:
1) Mis funciones Lambda suelen ser utilidades auxiliares para un proyecto más grande, por lo que creo un directorio /aws/lambdas dentro para albergarlas.
2) Cada directorio lambda individual contiene un archivo index.js que contiene el código de función, un archivo package.json que define las dependencias y un subdirectorio /node_modules . (Lambda no utiliza el archivo package.json, es solo para que podamos ejecutar el npm install
comando localmente).
paquete.json:
{
"name": "my_lambda",
"dependencies": {
"svg2png": "^4.1.1"
}
}
3) .gitignoro todos los directorios node_modules y los archivos .zip para que los archivos generados a partir de las instalaciones de npm y el compresión no abarroten nuestro repositorio.
.gitignore:
# Ignore node_modules
**/node_modules
# Ignore any zip files
*.zip
4) Ejecuto npm install
desde el directorio para instalar módulos y desarrollo/pruebo la función localmente.
5) Comprimo el directorio lambda y lo subo a través de la consola.
( IMPORTANTE: ¡No utilice la utilidad 'comprimir' de Mac desde Finder para comprimir el archivo! Debe ejecutar zip desde la CLI desde la raíz del directorio; consulte aquí ).
zip -r ../yourfilename.zip *
NOTA:
Es posible que tenga problemas si instala los módulos de nodo localmente en su Mac, ya que algunos módulos específicos de la plataforma pueden fallar cuando se implementan en el entorno basado en Linux de Lambda. (Ver https://stackoverflow.com/a/29994851/165673 )
La solución es compilar los módulos en una instancia EC2 iniciada desde la AMI que corresponde con el tiempo de ejecución de Lambda Node.js que está utilizando (consulte esta lista de tiempos de ejecución de Lambda y sus respectivas AMI ).
Consulte también Paquete de implementación de AWS Lambda en Node.js - AWS Lambda