Saltar al contenido

¿Cómo puedo instalar GraphicsMagick o ImageMagick en AWS Lambda?

Solución:

Hice girar la última versión de aws linux y ejecuté los siguientes comandos.

yum -y install gcc-c++ libpng-devel libjpeg-devel libtiff-devel wget
wget https://downloads.sourceforge.net/project/graphicsmagick/graphicsmagick/1.3.26/GraphicsMagick-1.3.26.tar.gz
tar zxvf GraphicsMagick-1.3.26.tar.gz
cd GraphicsMagick-1.3.26
./configure --prefix=/var/task/graphicsmagick --enable-shared=no --enable-static=yes
make
sudo make install
tar zcvf ~/graphicsmagick.tgz /var/task/graphicsmagick/

Busqué el directorio en mi local y lo arrojé en el paquete para que se comprimiera y se implementara. Mi diseño es similar al código de repositorio de AWS vinculado, pero modificado para sin servidor.

Código lambda:

// graphicsmagick dir is at the root of my project
const BIN_PATH = process.env['LAMBDA_TASK_ROOT'] + "/graphicsmagick/bin/";
const Gm = require('gm').subClass({ appPath: BIN_PATH });

// below is inside the handler
process.env['PATH'] = process.env['PATH'] + ':' + BIN_PATH;

serverless.yml

package:
  artifact: /path/to/function.zip

Utilizo el artefacto y construyo mi propio zip. Si se encuentra con el problema a continuación, le sugiero que lo haga. https://github.com/serverless/serverless/issues/3215

# -y to keep the symlinks and thus reduce the size from 266M to 73M
cd lambda && zip -FS -q -r -y ../dist/function.zip *

Ideas tomadas de:

https://gist.github.com/bensie/56f51bc33d4a55e2fc9a

https://github.com/awslabs/serverless-image-resizing

Editar: Es posible que desee ver también las capas lambda. Puede que solo necesite hacer este tipo de cosas una vez.

Si desea abordar el cambio de tamaño de la imagen, también puede echar un vistazo a la biblioteca de imágenes nítidas sin servidor que utiliza Sharp, una biblioteca Node.js de alto rendimiento para cambiar el tamaño de la imagen que es aproximadamente 3 veces más rápido en comparación con GM / IM. No proporcionó suficiente información para decir que se ajusta a los requisitos de su caso de uso, pero solo quería mencionarlo, ya que esta biblioteca ya me ahorró muchos costos de AWS Lambda hasta ahora.

Por cierto: no estoy relacionado con este proyecto (pero las licencias son MIT / Apache License 2.0 de todos modos).

Estuve luchando con esto durante un par de días, terminé pasando por el proceso yo mismo y de hecho funciona.

ImageMagick ya no se incluye con el tiempo de ejecución de Node.js 10.x. Hay 3 opciones para que ImageMagick funcione con su función Node.js 10.x:

1) Empaquete la dependencia e inclúyala en su archivo ZIP cargado (como este)

https://image-magick-example.s3-us-west-2.amazonaws.com/image-magick-example.zip

https://github.com/hmagdy/imagemagick-aws-lambda-Node.js10.x/tree/master/option1_image-magick-example-zip

Pero con opción: El paquete de implementación de su función Lambda “image-magick-example-zip-demo” es demasiado grande para habilitar la edición de código en línea. Sin embargo, aún puede invocar su función.

ingrese la descripción de la imagen aquí

o

2) Cree o use una capa Lambda que incluya ImageMagick, para hacer eso:

clone [email protected]:hmagdy/imagemagick-aws-lambda-Node.js10.x.git
cd imagemagick-aws-lambda-2
start Docker services
make all

Eso crearía un layer.zip dentro de la carpeta de compilación. Pero para ahorrarle algo de tiempo, aquí hay un archivo zip que puede usar para crear una capa Lambda.

https://image-magick-layer.s3-us-west-2.amazonaws.com/layer.zip

Cuando cree la capa, asegúrese de agregar Node.js 10.x como un tiempo de ejecución compatible. Luego puede configurar su función para usar la última versión de Node.js 10.xy agregar la capa que creó. ¡La conversión de imágenes debería funcionar de nuevo!

ingrese la descripción de la imagen aquí

Entonces puedes crear tu función aws lambda como esta

https://github.com/hmagdy/imagemagick-aws-lambda-Node.js10.x/tree/master/option2_image-magick-example-c_lib_layer/index.js

3) NodeJS Runtime Environment (npm) con AWS Lambda Layers, para hacer eso:

Además, si quieres usar

const imageThumbnail = require('image-thumbnail');

y consiguió

Runtime.ImportModuleError: Error: Cannot find module 'image-thumbnail'

debe seguir la opción 3:

https://github.com/hmagdy/imagemagick-aws-lambda-Node.js10.x/tree/master/option3_image-magick-example-npm_layer

Inspirado por:

https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *