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 二进制文件。
就是这样。我的代码按预期工作。如果您有更好的改进想法,我将不胜感激。
我正在使用 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 二进制文件。
就是这样。我的代码按预期工作。如果您有更好的改进想法,我将不胜感激。