amazon-web-services - tutorial - node_modules lambda
¿Cómo cargar módulos npm en AWS Lambda? (4)
Ahora puede usar Capas Lambda para estos asuntos. Simplemente agregue una capa que contenga el paquete que necesita y se ejecutará perfectamente.
Sigue esta publicación: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
He creado varias funciones de Lambda usando el editor basado en la web. Hasta ahora tan bueno. Ahora me gustaría comenzar a extender aquellos con módulos (como Q para promesas). No puedo entender cómo llevar los módulos a Lambda para que puedan ser consumidos por mis funciones.
He leído this pero parece implicar la configuración de un EC2 y ejecutar funciones Lambda desde allí. Existe un mecanismo para cargar un zip cuando se crea una función, pero parece implicar el envío de funciones desarrolladas localmente. Como estoy trabajando en el editor basado en la web, eso parece un flujo de trabajo extraño.
¿Cómo puedo simplemente implementar algunos módulos para usar en mis funciones de Lambda?
Espero que esto ayude, con el marco Serverless puedes hacer algo como esto:
- Agregue estas cosas en su archivo serverless.yml:
plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch)
2. Luego cree su función Lambda, impleméntela mediante
serverless deploy
, el paquete que se incluye en serverless.yml será allí para usted.
Para obtener más información sobre serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/
No puede cargar módulos NPM sin cargar un archivo
.zip
, pero en realidad puede reducir este proceso a dos líneas de comando rápidas.
Así es cómo:
-
Coloque sus archivos de funciones Lambda en un directorio separado. Esto se debe a que instala paquetes
npm
localmente para Lambda y desea poder aislar y probar lo que cargará en Lambda. -
Instale sus paquetes NPM localmente con
npm install packageName
mientras está en su directorio Lambda separado que creó en el paso 1. -
Asegúrese de que su función funciona cuando se ejecuta localmente:
node lambdaFunc.js
(simplemente puede comentar las dos líneasexport.handler
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 tiene instalado
aws-cli
, lo que sugiero tener si quiere hacer su vida más fácil, ahora puede ingresar este comando:aws lambda update-function-code --function-name lambdaFunc / --zip-file fileb://~/path/to/your/lambdaFunc.zip
(no hay citas alrededor de la parte lambdaFunc anterior en caso de que te preguntes como lo hice)
-
Ahora puede hacer clic en prueba 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 archivo
.zip
para incluir módulos
npm
en Lambda.
Y realmente no deberías usar el editor web Lambda para nada, ya que con cualquier código de producción, deberías estar desarrollando localmente, comprometiéndote con git, etc.
MI FLUJO:
1) Mis funciones de Lambda suelen ser utilidades auxiliares para un proyecto más grande, por lo que creo un directorio / aws / lambdas dentro de ese para alojarlas.
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 localmente el
npm install
).
package.json:
{
"name": "my_lambda",
"dependencies": {
"svg2png": "^4.1.1"
}
}
3) .gitignore todos los directorios node_modules y archivos .zip para que los archivos generados a partir de las instalaciones npm y la compresión no abarroten nuestro repositorio.
.gitignore:
# Ignore node_modules
**/node_modules
# Ignore any zip files
*.zip
4) Instalo módulos, desarrollo y pruebo localmente
5) Comprimo el directorio lambda y lo subo a través de la consola.
( IMPORTANTE: ¡No utilice la utilidad ''comprimir'' de Mac del Finder para comprimir el archivo! Debe ejecutar zip desde la CLI desde la raíz del directorio; consulte aquí )
zip -r ../yourfilename.zip *
Consulte también Paquete de implementación de AWS Lambda en Node.js - AWS Lambda
NOTA:
Puede encontrarse con un problema en el que un módulo como PhantomJS crea binarios específicos del sistema operativo, por lo que el paquete de nodos creado localmente en OSX termina fallando en Lambda.
La respuesta que encontré here fue usar estos scripts para construirlo dentro de un contenedor Docker.