Node ImageMagick 在本地成功但在 AWS Lambda 中失败

Node ImageMagick succeed locally but fails in AWS Lambda

我正在使用 this Node ImageMagick 通过在 AWS Lambda 函数中转换图像来验证图像。在本地我没有问题,但是当我部署我的函数时,我收到错误 no decode delegate for this image format on some images only only :

{ Error: Command failed: convert: no decode delegate for this image format `/tmp/925bf249f8297827f51f0370642eb560.jpg' @ error/constitute.c/ReadImage/544.
convert: no images defined `/tmp/5d2baeb2-de13-4868-a970-ad919c609440.png' @ error/convert.c/ConvertImageCommand/3046.

at ChildProcess.<anonymous> 
(/var/task/node_modules/imagemagick/imagemagick.js:88:15)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:886:16)
at Socket.<anonymous> (internal/child_process.js:342:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:497:12) timedOut: false, killed: false, code: 1, signal: null }

这是在我未能使用 AWS Lambda 内置的 ImageMagick 之后。知道我该如何解决这个问题吗?

我终于明白了!没有捷径可走。这就是我最终做的:

  • 我 运行 Parallel 在我的 Mac 上,我在虚拟 CentOS 机器上安装了 ImageMagick 的二进制文件。为了安装二进制文件,我遵循了 official website 中的指南。我在我的虚拟机中写了很多命令,但我可以将它们总结为:

    yum install sudo -y
    sudo yum -y install libpng-devel libjpeg-devel libtiff-devel gcc
    sudo curl -O http://www.imagemagick.org/download/ImageMagick.tar.gz
    sudo yum install tar -y
    sudo tar zxvf ImageMagick.tar.gz
    cd ImageMagick-7.0.8-22
    sudo ./configure --prefix=/var/task/imagemagick --enable-shared=no --enable-static=yes
    sudo yum install make -y
    sudo yum install automake autoconf libtool -y
    sudo sed -i 's|(gitversion|(./gitversion|' configure.ac
    sudo yum install git -y
    sudo autoreconf -i
    sudo sed -i '$a LANG=en_US.utf-8' /etc/environment
    sudo sed -i '$a LC_ALL=en_US.utf-8' /etc/environment
    sudo make
    sudo make install
    tar zcvf ~/imagemagick.tgz /var/task/imagemagick/`
    
  • 然后我将安装文件夹从虚拟机复制到我在 AWS Lambda 存储库根目录中命名为 /lib 的文件夹中。

  • 然后为了使用新的二进制文件,我需要在每次部署时将 ImageMagick 文件夹从 /lib 复制到我的 node_modules 中。这是因为 AWS Lambda 不允许我直接从 /lib 访问任何二进制文件,原因不明。为了在每次部署时执行复制,我将以下行添加到我的 deploy.sh 文件中:

    `cp -R ./lib/imagemagick ./node_modules/imagemagick`
    
  • 现在可以使用二进制文件了,但是 AWS Lambda 仍然没有允许我直接从 node_modules 中执行 运行 任何命令。所以每次我需要 运行 一个特定的命令时,我需要将它(它是一个二进制文件)复制到 /tmp 文件夹中,然后我需要更改它的模式 chmod 才能到运行吧。这是每个所需命令的代码(在 Node 中):

    const command = '/node_modules/imagemagick/[command path and file]';
    execSync(`cp -a ${command} /tmp/`);
    fs.chmodSync(command, 755);
    execSync(`chmod +x ${command}`);
    
  • 现在命令可以与 child_process 一起使用了。例如:

    const argus = [originalImage, '-o', newImage];
    child_process.execFile(command, argus, (err, stdout, stderr) (
        if (err) throw err;
        console.log('IMAGE CONVERTED');
    )}
    
  • 以上内容不仅适用于 ImageMagick,还适用于 AWS Lambda 所需的任何其他二进制文件。我在函数的其他地方对 Google 的 WebP 库应用了相同的方法。我从 Google developers 网站下载了它的 Linux 二进制文件。

就是这样。我的代码按预期工作。如果您有更好的改进想法,我将不胜感激。