节点ImageMagick在本地成功,但在AWS Lambda中失败

时间:2018-12-18 13:32:59

标签: node.js amazon-web-services aws-lambda imagemagick

我正在使用this Node ImageMagick通过在AWS Lambda函数中进行转换来验证图像。在本地我没有问题,但是在部署函数时,我仅在某些图像上得到错误no decode delegate for this image format

{ 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之后的。知道我该如何解决吗?

1 个答案:

答案 0 :(得分:3)

最后我想通了!没有捷径可走。这就是我最终要做的:

  • 我在Mac上运行Parallel,并在虚拟ImageMagick计算机上安装了CentOS的二进制文件。要安装二进制文件,我遵循了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二进制文件。

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