首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在AWS Lambda上安装GraphicsMagick或ImageMagick?

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

Stack Overflow用户
提问于 2017-06-24 03:58:06
回答 5查看 19.1K关注 0票数 28

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

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

由于某些原因,某些图像的调整大小功能失败。

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

如果我用sudo yum install GraphicsMagick安装GraphicsMagick。这允许我的脚本执行大小调整而不会出现错误。

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

然而,我不确定如何在我的部署中与serverless捆绑在一起。如果我使用sudo yum --installroot=/var/task install GraphicsMagick将GraphicsMagick安装到与脚本相同的文件夹中,并使用以下REQUIRE语句运行脚本:

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

当我在EC2实例上运行我的脚本时,可以调整大小。但是当我使用无服务器部署,并且脚本在Lambda中运行时,可执行文件似乎被破坏了。调用gm(buffer).size(/*...*/)时,gm会失败,并显示以下错误。

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-08-08 05:20:14

我启动了最新的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 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;

serverless.yml

package:
  artifact: /path/to/function.zip

我使用这个工艺品并构建我自己的zip。如果你遇到下面的问题,我建议你这样做。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

编辑:可能还想查看lambda layers。可能只需要做一次这样的事情。

票数 27
EN

Stack Overflow用户

发布于 2017-06-27 05:26:07

所有依赖项均可打包并上传为AWS Lambda函数的一部分

您可以使用AWS Lambda提供的任何包,前提是您可以将其放入allowed size limits并上传压缩文件。请看一下AWS Lambda Deployment Limits部分

此外,这里有一个如何打包依赖项(用于python代码) https://stackoverflow.com/a/36093281/358013的示例

票数 1
EN

Stack Overflow用户

发布于 2017-10-27 06:29:28

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44729088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档