webentwicklung-frage-antwort-db.com.de

Wie kann ich GraphicsMagick oder ImageMagick auf AWS Lambda installieren?

Ich verwende das gm-Paket für Node.js zusammen mit der Standard-ImageMagick-Installation, die auf AWS Lambda verfügbar ist.

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

Aus irgendeinem Grund schlägt die Größenänderungsfunktion für bestimmte Bilder fehl.

Ich habe eine EC2-Instanz mit Amazon Linux AMI (AMI-hvm-2016.03.3.x86_64-gp2) erstellt. Ich habe die (alte) Version 6.x von ImageMagick installiert, die von yum verfügbar ist. Wenn ich mein Skript mit dieser Installation auf der EC2-Instanz ausführe, wird der Fehler reproduziert, den ich sehe, wenn der Code auf Lambda ausgeführt wird. Dies bestätigt, dass es sich um eine IM-Version handelt, die den Fehler verursacht.

Wenn ich GrpahicsMagick mit Sudo yum install GraphicsMagick installiere. Dadurch kann mein Skript die Größenänderung fehlerfrei durchführen.

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

Ich bin jedoch nicht sicher, wie ich dies in meinem Deployment mit serverless bündeln soll. Wenn ich GraphicsMagick im selben Ordner wie das Skript mit Sudo yum --installroot=/var/task install GraphicsMagick installiere und mein Skript stattdessen mit dieser require-Anweisung ausführe:

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

Die Größenänderung funktioniert, wenn ich mein Skript auf der EC2-Instanz ausführe. Aber wenn ich mit serverless einsetze und das Skript in Lambda läuft, scheint die ausführbare Datei kaputt zu sein. gm schlägt mit dem folgenden Fehler bei einem Aufruf von gm(buffer).size(/*...*/) fehl.

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

Wie kann ich eine Version von ImageMagick oder GraphicsMagick erstellen, die ohne Server bereitgestellt werden kann?

15
wprl

Ich habe die neueste Version von aws Linux hochgefahren und die folgenden Befehle ausgeführt. 

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/

Ich scp das Verzeichnis in mein lokales Verzeichnis und warf es in das Paket, um es zu komprimieren und bereitzustellen. Mein Layout ähnelt dem aws-Repo-Code, wurde jedoch für Serverless geändert.

Lambda-Code:

// 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

Ich benutze das Artefakt und baue meinen eigenen Zip. Wenn Sie auf das folgende Thema stoßen, schlage ich vor, dass Sie das tun. 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 *

Ideen aus:

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

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

Edit: Vielleicht möchten Sie auch Lambda-Layer auschecken. Möglicherweise müssen Sie diese Dinge nur einmal tun.

16
pbsladek

Wenn Sie die Bildgrößenanpassung in Angriff nehmen möchten, können Sie auch die serverlose scharfe Bildbibliothek betrachten , die Sharp verwendet, eine leistungsstarke Node.js-Bibliothek für die Bildgrößenänderung, die etwa 3 - 5 x schneller ist zu GM/IM. Sie haben nicht genügend Informationen bereitgestellt, um anzugeben, dass sie Ihren Anforderungen entsprechen, aber ich wollte es nur erwähnen, da diese Bibliothek mir schon viel AWS Lambda-Kosten erspart hat.

Übrigens: Ich bin mit diesem Projekt nicht verwandt (Lizenzen sind aber MIT/Apache License 2.0).

6
Tom

Für node.js können Sie node-lambda verwenden. Dies vereinfacht das Packen mit einem Docker-Image:

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

Das Argument -I startet ein Docker-Image und startet npm i in Ihrem Projekt, sodass die binären Knotenmodule entsprechend der richtigen Architektur kompiliert werden.

1
Jide

Alle Abhängigkeiten können als Teil Ihrer AWS Lambda-Funktion gepackt und hochgeladen werden

Sie können in der Regel jedes beliebige Paket von AWS Lambda verwenden, wenn Sie es innerhalb der zulässigen zulässigen Größenbegrenzung anpassen und die Zip-Datei hochladen können. Schauen Sie sich den Abschnitt AWS Lambda Deployment Limits an

Hier ein Beispiel, wie Abhängigkeiten gepackt werden sollen (für Python-Code) https://stackoverflow.com/a/36093281/358013

1
blueskin

Wie ich überprüft habe, ist der imageMagick bereits in einer Lambda-Umgebung vorhanden. So können wir alle Bibliotheksgrafiken verwenden, Bilder, die mit imageMagick zusammenhängen. Siehe: https://serverless.com/blog/building-a-serverless-screenshot-service-with-lambda/

0
Thuy Nguyen

Wenn Sie Docker auf Ihrem lokalen Gerät installieren und diesen Befehl in Ihre package.json einfügen.

"dockerbuild": "rm -rf node_modules/gm && docker run -v \"$PWD\":/var/task lambci/lambda:build-nodejs8.10 npm install"

Lauf npm run dockerbuild, bevor Sie Ihre App bereitstellen.

Sie sollten die Knotenversion basierend auf der Version Ihrer Lambda-Umgebung ändern.

0