node.js - 如何在 AWS Lambda 上安装 GraphicsMagick 或 ImageMagick?

标签 node.js imagemagick aws-lambda graphicsmagick serverless-framework

我正在使用 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 });

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

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

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

无法获取图像大小:ERR: {"code":"EPIPE","errno":"EPIPE","syscall":"write"}

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

最佳答案

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

我将目录 scp 到我的本地并将其放入要压缩和部署的包中。我的布局类似于链接的 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

我使用工件并构建自己的 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 .这种事情可能只需要做一次。

关于node.js - 如何在 AWS Lambda 上安装 GraphicsMagick 或 ImageMagick?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44729088/

相关文章:

node.js - AWS S3 - 从 getSignedUrl() PUT 到 URL 返回 403 SignatureDoesNotMatch 错误

resize - ImageMagick 合成在合成前调整图像大小

ruby-on-rails - 为什么 Ruby open-uri open 在我的单元测试中返回一个 StringIO,而在我的 Controller 中返回一个 FileIO?

javascript - mongodb/mongoose 中的保存方法

javascript - Axios 向后端发布请求参数未定义

javascript - 如何在 Node 中使用 Imagemagick 调整图像大小并降低 DPI

aws-lambda - 针对调度周期 > 1 天的 Lambda 调用的 CloudWatch 警报

amazon-web-services - 强制丢弃 AWS Lambda 容器

node.js - npm 5.4.1 安装/卸载全部失败

node.js - 为什么我在生产环境中 deproy Next.js 示例项目时 CSS 不起作用?