我如何在AWS Lambda上安装GraphicsMagick或ImageMagick?

我正在使用Node.js的gm包以及AWS Lambda上提供的默认ImageMagick安装。

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

出于某种原因,某些图像的大小调整function失败。

我使用Amazon Linux AMI创build了一个EC2实例(ami-hvm-2016.03.3.x86_64-gp2)。 我安装了yum提供的ImageMagick(旧)6.x版本。 当我使用EC2实例上的安装来运行我的脚本时,它再现了我在Lambda上运行代码时看到的故障,确认这是导致故障的IM版本。

如果我安装GrpahicsMagick与sudo yum install GraphicsMagick 。 这允许我的脚本无误地执行调整。

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

不过,我不知道如何将这个与无服务器部署捆绑在一起。 如果我使用sudo yum --installroot=/var/task install GraphicsMagick到脚本所在的文件夹中,并使用这个require语句来运行我的脚本:

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

当我在EC2实例上运行我的脚本时,resize工作。 但是,当我使用无服务器进行部署时,脚本在Lambda中运行时,可执行文件似乎已损坏。 gm在调用gm(buffer).size(/*...*/)出现以下错误。

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

我如何构build可以使用无服务器部署的ImageMagick或GraphicsMagick版本?

我创build了最新的aws linux并运行下面的命令。

 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/ 

我把这个dir放到我的本地,然后把它扔进包里压缩和部署。 我的布局类似于aws回购代码链接,但修改为无服务器。

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 

我使用神器,并build立我自己的压缩。 如果你遇到下面的问题,我build议你这样做。 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 * 

想法从:

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

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

所有依赖项都可以作为AWS Lambda函数的一部分进行打包和上载

如果您可以在允许的大小限制内使用,并且上传zip文件,那么您主要可以使用AWS Lambda所需的任何软件包。 查看AWS Lambda Deployment Limits部分

另外,这里是一个如何打包依赖的例子(对于python代码) https://stackoverflow.com/a/36093281/358013

如果你想解决图像大小调整,你也可以看一下无服务器的清晰图像库 ,它使用夏普 ,一个高性能的Node.js库进行图像调整大约比GM / IM快3倍到5倍。 你没有提供足够的信息来说明它符合你的用例需求,但是我只是想提一下,因为这个库已经为我节省了很多AWS Lambda成本。

顺便说一句:我不涉及这个项目(但许可证是麻省理工学院/ Apache许可证2.0无论如何)。

对于node.js,您可以使用node-lambda ,它简化了使用Docker镜像的打包:

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

-I参数将启动一个docker镜像,并在您的项目中启动npm i ,以便在正确的体系结构中编译二进制node_modules。