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

2023-12-30

我正在使用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 导致了故障。

如果我安装 GraphicsMagicksudo 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 版本?


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

我将目录复制到本地并将其放入要压缩和部署的包中。我的布局类似于链接的 aws 存储库代码,但针对无服务器进行了修改。

拉姆达代码:

// 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;

无服务器.yml

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

我使用该工件并构建了我自己的 zip。如果您遇到以下问题,我建议您这样做。https://github.com/serverless/serverless/issues/3215 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://gist.github.com/bensie/56f51bc33d4a55e2fc9a

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

编辑: 可能还想查看拉姆达层 https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html。这种事情可能只需要做一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 AWS Lambda 上安装 GraphicsMagick 或 ImageMagick? 的相关文章

随机推荐

  • 通用应用程序:仅构建经典工具包

    我必须从头开始创建一个通用应用程序 首先是经典应用程序 在未来的某个时候 是现代应用程序 我已经使用 Cmd 生成了该应用程序 我已经实现了经典应用程序所需的基础知识 分离了可以在现代应用程序中重用的所有内容 并将其放入共享目录中 问题是
  • read.csv 比 data.table::fread 更快 [重复]

    这个问题在这里已经有答案了 在网上我可以看到我应该使用 data table 和 fread 来加载我的数据 但是当我运行基准测试时 我得到以下结果 Unit milliseconds expr min lq mean median uq
  • UILabel 中的居中文本

    如何使 UILabel 中的文本居中 代码是 yourLabel setTextAlignment UITextAlignmentCenter 或 当然 Obj C 2 0 点语法 yourLabel textAlignment UITex
  • 寄存器与堆栈

    与使用基于堆栈的虚拟机相比 使用基于寄存器的虚拟机到底有哪些优点和缺点 对我来说 基于寄存器的机器似乎更容易编程并且更高效 那么为什么 JVM CLR 和 Python VM 都是基于堆栈的呢 在硬件中实现时 基于寄存器的机器将变得更加高效
  • 在 xcode 中搜索硬编码文本

    您好 我想本地化我的应用程序 但问题是我在 xib 文件中的代码周围都有硬编码文本 我想要快速外部化的方法 或者更好地获取所有硬编码文本并将其放入外部文件中 如果有人之前做过这个 请分享 您可以使用正则表达式在所有项目中进行搜索 Press
  • 使用“存在”进行额外的哈希查找?

    我有时会访问这样的哈希 if exists ids name id ids name 这是好的做法吗 我有点担心它包含两次查找 而实际上应该完成一次查找 有没有更好的方法来检查是否存在并赋值 通过检查exists 你可以阻止自动生存 看Au
  • 如何使用箭头键禁用 FF 中的页面滚动

    我正在构建一个包含主题和项目的菜单 每个主题都可以通过单击展开和折叠 我的任务是使用向上和向下箭头键在菜单主题和项目之间移动成为可能 我已经这样做了 但问题是 当页面大于窗口时 按箭头键时页面会滚动 我尝试过使用 document body
  • 如何合并两个csv文件?

    我有两个这样的 csv 文件 id h1 h2 h3 1 blah blahla 4 bleh bleah 我想合并这两个文件 这样如果两个文件中有相同的 id 则该行的值应该来自第二个文件 如果它们具有不同的 id 则合并的文件应包含这两
  • 无法启动程序运行program_run

    错误的来源 io cdap cdap internal app runtime distributed remote RemoteExecutionTwillRunnerService 543 runtime startup 1 错误信息
  • 为什么GL替你把`gl_Position`除以W而不是让你自己做呢?

    注意 我了解基本数学 据我了解 典型的perspective各种数学库中的函数会生成一个矩阵 将 z 值从 zNear 到 zFar 转换回 1 到 1 但前提是结果除以w 具体问题是 GPU 为你做这件事而不是你自己做这件事能获得什么好处
  • 如何在 Windows 上从 Python 执行 Javascript?

    如何在 Windows 上从 Python 执行 Javascript 我想获得 python spidermonkey 功能 像这样 gt gt gt class Foo def hello self print Hello Javasc
  • 如何自动化 Outlook?

    我正在尝试从我们的 ERP 系统发送电子邮件 我尝试使用 SMTP 但它仅适用于内部邮件 不适用于外部邮件 抱怨无法中继或其他问题 我认为经理要么不想 要么不知道如何正确配置 Exchange 所以我的老板告诉我使用 Outlook 问题是
  • 无法为 log4j 设置 LevelRangeFilter

    我正在使用此属性文件在 Spring 中设置 log4j log4j appender EMAIL org apache log4j net SMTPAppender log4j appender EMAIL filter org apac
  • 每次页面加载时提取随机图像

    在每个页面加载时我都会更改图像 我发现这个插件做得很好 function randomImage defaults you can change these defaults to your own preferences path tem
  • SwiftUI 是否有类似 Cocoa 的 nextKeyView 的功能,以便我可以指定当我点击 Tab 时 TextView 获取光标的确切顺序?

    想象一下 我有 6 个文本字段排列在 3 列 2 行的网格中 我们将通过它们在此网格中的 X Y 位置来引用它们 从左上角 TextField 中的 1 1 开始 到右下角中的 3 2 开始 当我运行这个程序时 我将光标放在 TextFie
  • 如何在 Qt 中的第二个显示器上全屏显示窗口窗体?

    我在linux上使用Qt5 我想在第二个屏幕 双显示器 上全屏显示窗口形式 我尝试了这段代码 但它不起作用 还有其他办法吗 QRect screenres QApplication desktop gt screenGeometry 1 s
  • 更改表视图单元格中重新排序控件的颜色

    在下图中 如何将视图右侧按钮的颜色更改为白色 编辑 理想情况下只希望某些单元格为白色 其他单元格为黑色这是我的代码 cell backgroundColor appOrange cell contentLabel textColor whi
  • 这个 iOS 控件叫什么?

    我无法找到或记住 iOS 应用程序底部弹出的此选项控件的名称 让我知道 这就是所谓的UIActionSheet UIActionSheet 类参考 https developer apple com library ios document
  • Ruby 发送 JSON 请求

    如何在 ruby 中发送 JSON 请求 我有一个 JSON 对象 但我认为我不能这样做 send 我必须让 javascript 发送表单吗 或者我可以在 ruby 中使用 net http 类吗 使用 header content ty
  • 如何在 AWS Lambda 上安装 GraphicsMagick 或 ImageMagick?

    我正在使用gmNode js 包以及 AWS Lambda 上提供的默认 ImageMagick 安装 const gm require gm subClass imageMagick true 由于某些原因 某些图像的调整大小功能失败 我