¿Cómo cargar módulos npm en AWS Lambda?

Resuelto Fook asked hace 54 años • 10 respuestas

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?

Fook avatar Jan 01 '70 08:01 Fook
Aceptado

No puede cargar módulos NPM sin cargar un .ziparchivo, pero puede reducir este proceso a dos líneas de comando rápidas.

Así es cómo:

  1. Coloque sus archivos de función Lambda en un directorio separado. Esto se debe a que instala npmpaquetes localmente para Lambda y desea poder aislar y probar lo que cargará en Lambda.

  2. Instale sus paquetes NPM localmente npm install packageNamemientras se encuentra en su directorio Lambda separado que creó en el paso 1.

  3. Asegúrese de que su función funcione cuando se ejecuta localmente: node lambdaFunc.js(simplemente puede comentar las dos export.handlerlíneas en su código para adaptar su código para que se ejecute con Node localmente).

  4. Vaya al directorio de Lambda y comprima el contenido , asegúrese de no incluir el directorio en sí.

    zip -r lambdaFunc.zip .
    
  5. Si tienes aws-cliinstalado, 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)

  6. Ahora puede hacer clic en probar en la consola Lambda.

  7. 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"
    
JohnAllen avatar Dec 23 '2015 15:12 JohnAllen

Se requiere un .ziparchivo 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 installcomando 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 installdesde 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

Yarin avatar Nov 23 '2018 16:11 Yarin