Wie kann ich der Installation von GraphicsMagick oder ImageMagick auf AWS Lambda?
Ich bin mit der gm
- Paket für Node.js zusammen mit dem Standard-ImageMagick-installation, die auf AWS Lambda.
const gm = require('gm').subClass({ imageMagick: true });
Aus irgendeinem Grund, das resize-Funktionalität scheitert für bestimmte Bilder.
Ich habe eine EC2-Instanz mit dem Amazon Linux AMI (ami-hvm-2016.03.3.x86_64-gp2).
Ich installierte die (alte) 6.x-version von ImageMagick verfügbar ist yum
. Wenn ich mein Skript mit, die Installation auf der EC2-Instanz, es reproduziert die Fehler sehe ich, wenn der code läuft auf Lambda-Bestätigung ist etwas, das mit dieser version von IM, das den Fehler verursacht.
Wenn ich installieren, GraphicsMagick mit sudo yum install GraphicsMagick
. Dies ermöglicht mein Skript zum ausführen der Größe ohne Fehler.
const gm = require('gm').subClass({ imageMagick: false });
Allerdings bin ich mir nicht sicher, wie Sie Sie zu bündeln, diese in meinem bereitstellen, mit serverlose. Wenn ich GraphicsMagick installieren in den gleichen Ordner wie das Skript mit sudo yum --installroot=/var/task install GraphicsMagick
, und führen Sie das Skript mithilfe dieses require-Anweisung statt:
const gm = require('gm').subClass({ imageMagick: false, appPath: './usr/bin/' });
Die Größe der Arbeit, wenn ich mein Skript auf der EC2-Instanz. Aber wenn ich für die Bereitstellung serverlose, und das Skript läuft in Lambda, die ausführbare Datei scheint kaputt zu sein. gm
schlägt mit den folgenden Fehler bei einem Aufruf gm(buffer).size(/*...*/)
.
could not get the image size: ERR:
{"code":"EPIPE","errno":"EPIPE","syscall":"write"}
Wie kann ich erstellen Sie eine version von ImageMagick oder GraphicsMagick, die bereitgestellt werden kann, mit serverlose?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Drehte ich mich das Letzte aws-linux und ran an die unten angegebenen Befehle.
Ich mit scp die dir unten in meinem lokalen und warf es in das Paket gepackt werden und eingesetzt werden. Mein layout ist ähnlich wie die aws-repo-code verlinkt, aber modifiziert für serverlose.
Lambda-code:
serverlose.yml
Ich nutze das Artefakt, und Baue meine eigenen zip. Wenn Sie die Frage unten, ich schlage vor, Sie tun, dass.
https://github.com/serverless/serverless/issues/3215
Ideen packte aus:
https://gist.github.com/bensie/56f51bc33d4a55e2fc9a
https://github.com/awslabs/serverless-image-resizing
Bearbeiten:
Vielleicht möchten Sie auch prüfen,lambda-Schichten. Kann auch nur das zu tun diese Art der Sache einmal.
tar
,gzip
undmake
. Eine weitere option anstelle der scp ist auf (dem host) ausgeführtdocker cp [container id]:/root/graphicsmagick.tgz ./
process.env['PATH'] = process.env['PATH'] + ':' + BIN_PATH;
im inneren der hf. Und ich habe alle diese Schritte und immer noch nicht in der Lage gewesen, es zu schaffen. Ich bekomme immer eine Fehlermeldung, in der mirCould not execute GraphicsMagick/ImageMagick: /var/task/graphicsmagick/bin/gm ... ...this most likely means the gm/convert binaries can't be found
Wenn Sie angehen möchte, ändern der Bildgröße, können Sie auch einen Blick auf die serverlose scharfes Bild-Bibliothek, die verwendet Scharfe, eine hohe Leistung Node.js Bibliothek für die Skalierung von Bildern, die etwa 3x - 5x schneller im Vergleich zu GM/IM. Sie hat nicht genügend Informationen zu sagen, dass es passt Ihre Anforderungen, aber ich wollte es nur mal erwähnen, da diese Bibliothek bereits ersparte mir eine Menge von AWS Lambda Kosten so weit.
Übrigens: ich bin nicht im Zusammenhang mit diesem Projekt (aber die Lizenzen MIT/Apache-Lizenz 2.0 sowieso).
Alle Abhängigkeiten werden kann, gepackt und hochgeladen, als einen Teil Ihrer AWS Lambda-Funktion
Können Sie meist jedes Paket, das Sie möchten von AWS Lambda, wenn Sie passen kann es innerhalb der zulässige Größe begrenzt und laden Sie die zip-Datei. Werfen Sie einen Blick auf die
AWS Lambda Deployment Limits
AbschnittAuch, hier ist ein Beispiel, wie man package-Abhängigkeiten (python code) https://stackoverflow.com/a/36093281/358013
Für node.js Sie können Knoten-lambda, es vereinfacht die Verpackung mit einem docker-image :
Den
-I
argument Start wird ein docker-image und starten Sienpm i
in Ihrem Projekt, so wird es kompilieren Sie das binäre node_modules gegen die richtige Architektur.serverless deploy
?Bei der Installation von Docker auf Ihrem lokalen Gerät, und fügen Sie diesen Befehl in Ihr Paket.json.
Laufen
npm run dockerbuild
vor der Bereitstellung Ihrer app.Sollten Sie ändern Sie die Knoten-version basiert auf die version des lambda-Umgebung.
Als ich überprüft, die ist imageMagick existiert bereits auf aws lambda Umgebung. So können wir alle Bibliothek mit Grafiken, Bildern im Zusammenhang mit imageMagick. Siehe: https://serverless.com/blog/building-a-serverless-screenshot-service-with-lambda/