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) ImageMagick disponible à partir 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 avec cette version de 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 j'installe GraphicsMagick dans le même dossier que le script avec Sudo yum --installroot=/var/task install GraphicsMagick
, et l'exécute à l'aide de cette instruction require:
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 mise en page 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 fichier 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
Edit: Peut aussi vouloir vérifier lambda layers . Peut seulement avoir besoin de faire ce genre de chose une fois.
Si vous souhaitez vous attaquer au redimensionnement d’image, vous pouvez également consulter la bibliothèque d’images vives sans serveur qui utilise Sharp , une bibliothèque haute performance Node.js pour le redimensionnement d’image environ 3x - 5 fois 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.
Soit dit en passant: je ne suis pas lié à ce projet (mais les licences sont quand même MIT/Apache License 2.0).
Pour node.js, vous pouvez utiliser node-lambda , cela simplifie l’emballage à 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 qu'il compile les modules binaires node_modules contre la bonne architecture.
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'ajuster dans les limites de taille allowed et télécharger le fichier Zip. Jetez un coup d'œil à la 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