Comment installer GraphicsMagick ou ImageMagick sur AWS Lambda?

J’utilise le package gm pour Node.js avec l’installation par défaut d’ImageMagick disponible sur AWS Lambda.

const gm = require('gm').subClass({ imageMagick: true });

Pour une raison quelconque, la fonctionnalité de redimensionnement échoue pour certaines images.

J’ai créé une instance EC2 avec une AMI Amazon Linux (ami-hvm-2016.03.3.x86_64-gp2). J’ai installé la version 6.x (ancienne) d’ImageMagick disponible auprès de yum . Lorsque j’exécute mon script avec cette installation sur l’instance EC2, il reproduit l’échec que je vois lorsque le code est exécuté sur Lambda, en confirmant qu’il s’agit d’un problème lié à cette version de la messagerie instantanée.

Si j’installe GrpahicsMagick avec sudo yum install GraphicsMagick . Cela permet à mon script d’effectuer les redimensionnements sans erreur.

const gm = require('gm').subClass({ imageMagick: false });

Cependant, je ne sais pas comment intégrer cela dans mon déploiement à un serveur sans serveur. Si sudo yum --installroot=/var/task install GraphicsMagick GraphicsMagick dans le même dossier que le script avec sudo yum --installroot=/var/task install GraphicsMagick et exécutez mon script en utilisant cette instruction require à la place:

const gm = require('gm').subClass({ imageMagick: false, appPath: './usr/bin/' });

Le redimensionnement fonctionne lorsque j’exécute mon script sur l’instance EC2. Mais lorsque je déploie avec serverless et que le script est exécuté dans Lambda, l’exécutable semble être endommagé. gm échoue avec l’erreur suivante lors d’un appel à gm(buffer).size(/*...*/) .

could not get the image size: ERR: {"code":"EPIPE","errno":"EPIPE","syscall":"write"}

Comment créer une version d’ImageMagick ou GraphicsMagick pouvant être déployée sans serveur?

J’ai filé le dernier aws linux et exécuté les commandes ci-dessous.

 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/ 

Je scp le répertoire dans mon local et jeté dans le paquet pour être compressé et déployé. Ma présentation est similaire au code awo repo lié, mais modifié pour sans serveur.

Code 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 

J’utilise l’artefact et crée mon propre zip. Si vous rencontrez le problème ci-dessous, je vous suggère de le faire. 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 * 

Idées saisies de:

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

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

Si vous souhaitez vous attaquer au redimensionnement d’image, consultez également la bibliothèque d’images Sharp sans serveur, qui utilise Sharp , une bibliothèque haute performance Node.js pour le redimensionnement d’image qui est environ 3x – 5x plus rapide que GM / IM. Vous n’avez pas fourni suffisamment d’informations pour dire que cela répond à vos exigences en matière d’utilisation, mais je voulais simplement le mentionner, car cette bibliothèque m’a déjà économisé beaucoup de coûts AWS Lambda jusqu’à présent.

A propos: je ne suis pas lié à ce projet (mais les licences sont quand même MIT / Apache License 2.0).

Toutes les dépendances peuvent être compressées et téléchargées dans le cadre de votre fonction AWS Lambda.

Vous pouvez principalement utiliser n’importe quel package AWS Lambda de votre choix, si vous pouvez l’adapter à la taille autorisée et télécharger le fichier zip. AWS Lambda Deployment Limits section AWS Lambda Deployment Limits .

En outre, voici un exemple de mise en package des dépendances (pour le code python) https://stackoverflow.com/a/36093281/358013

Pour node.js, vous pouvez utiliser node-lambda , cela simplifie l’empaquetage à l’aide d’une image de menu fixe:

 node-lambda package -I lambci/lambda:build-nodejs6.10 -A . -x '*.lock *.zip' 

L’argument -I lancera une image de menu fixe et lancera npm i dans votre projet afin de comstackr les modules binarys node_modules contre la bonne architecture.