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

wpr*_*prl 21 imagemagick node.js graphicsmagick aws-lambda serverless-framework

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

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

出于某种原因,某些图像的调整大小功能失败.

我使用Amazon Linux AMI(ami-hvm-2016.03.3.x86_64-gp2)创建了一个EC2实例.我安装了可用的(旧)6.x版ImageMagick yum.当我在EC2实例上使用该安装运行我的脚本时,它会再现我在Lambda上运行代码时看到的失败,确认这是导致失败的此版本IM的问题.

如果我安装GrpahicsMagick sudo yum install GraphicsMagick.这允许我的脚本无错误地执行调整大小.

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

但是,我不确定如何在无服务器的部署中捆绑这个.如果我将GraphicsMagick安装到与脚本相同的文件夹中sudo yum --installroot=/var/task install GraphicsMagick,并使用此require语句运行我的脚本:

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

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

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

如何构建可以无服务器部署的ImageMagick或GraphicsMagick版本?

pbs*_*dek 21

我旋转了最新的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/
Run Code Online (Sandbox Code Playgroud)

我将dir打到我的本地,然后将它扔进包装中进行拉链和展开.我的布局类似于链接的aws repo代码,但是针对无服务器进行了修改.

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;
Run Code Online (Sandbox Code Playgroud)

serverless.yml

package:
  artifact: /path/to/function.zip
Run Code Online (Sandbox Code Playgroud)

我使用神器并建立自己的拉链.如果你遇到下面的问题,我建议你这样做. 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 *
Run Code Online (Sandbox Code Playgroud)

抓住的想法来自:

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

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

编辑:可能还想检查lambda图层.可能只需要做一次这样的事情.

  • 我正在与依赖的libs挣扎...当我在lambda上运行gm时找不到例如libjpeg.so.62 (2认同)

Tom*_*Tom 7

如果你想解决图像大小调整问题,你也可以看看使用Sharp无服务器清晰图像库,这是一个高性能的Node.js库,用于图像大小调整,与GM/IM相比,速度提高了约3倍 - 5倍.您没有提供足够的信息来说它符合您的用例要求,但我只是想提一下,因为这个库到目前为止已经为我节省了大量的AWS Lambda成本.

顺便说一下:我与这个项目无关(但许可证仍然是MIT/Apache License 2.0).


HMa*_*gdy 7

我为此苦苦挣扎了几天,最终自己完成了这个过程,它确实有效。

ImageMagick 不再与 Node.js 10.x 运行时捆绑在一起。有 3 个选项可以让 ImageMagick 与您的 Node.js 10.x 函数一起工作:

1) 打包依赖项并将其包含在您上传的 ZIP 文件中(就像这个)

https://image-magick-example.s3-us-west-2.amazonaws.com/image-magick-example.zip

https://github.com/hmagdy/imagemagick-aws-lambda-Node.js10.x/tree/master/option1_image-magick-example-zip

但有选项:您的 Lambda 函数“image-magick-example-zip-demo”的部署包太大,无法启用内联代码编辑。但是,您仍然可以调用您的函数。

在此处输入图片说明

或者

2) 创建或使用一个包含 ImageMagick 的 Lambda 层来做到这一点:

clone git@github.com:hmagdy/imagemagick-aws-lambda-Node.js10.x.git
cd imagemagick-aws-lambda-2
start Docker services
make all
Run Code Online (Sandbox Code Playgroud)

这将在 build 文件夹中创建一个layer.zip。但为了节省您的时间,这里有一个 zip 文件,您可以使用它来创建 Lambda 层。

https://image-magick-layer.s3-us-west-2.amazonaws.com/layer.zip

创建层时,请确保将 Node.js 10.x 添加为受支持的运行时。然后,您可以将函数设置为使用最新的 Node.js 10.x 并添加您创建的层。然后图像转换应该再次工作!

在此处输入图片说明

然后你可以像这样创建你的 aws lambda 函数

https://github.com/hmagdy/imagemagick-aws-lambda-Node.js10.x/tree/master/option2_image-magick-example-c_lib_layer/index.js

3) 带有 AWS Lambda 层的 NodeJS 运行时环境 (npm),为此:

另外,如果你想使用

const imageThumbnail = require('image-thumbnail');
Run Code Online (Sandbox Code Playgroud)

并得到

Runtime.ImportModuleError: Error: Cannot find module 'image-thumbnail'
Run Code Online (Sandbox Code Playgroud)

您应该遵循选项 3:

https://github.com/hmagdy/imagemagick-aws-lambda-Node.js10.x/tree/master/option3_image-magick-example-npm_layer

灵感来自:

https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e