簡體   English   中英

節點ImageMagick在本地成功但在AWS Lambda中失敗

[英]Node ImageMagick succeed locally but fails in AWS Lambda

我正在使用此Node ImageMagick通過在AWS Lambda函數中轉換它們來驗證圖像。 本地我沒有問題,但是當我部署我的函數時,我只在某些圖像上獲得了no decode delegate for this image format的錯誤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之后。 知道如何解決這個問題嗎?

最后我想通了! 這沒有簡短的方法。 這就是我最終做的事情:

  • 我在Mac上運行了Parallel ,我在虛擬CentOS機器上安裝了ImageMagick的二進制文件。 要安裝二進制文件,我按照官方網站上的指南進行操作。 我在我的虛擬機中編寫了很多命令,但我可以將它們總結為:

     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的文件夾中。

  • 然后,為了使用新的二進制文件,我需要在每次部署時將/lib ImageMagick文件夾復制到我的node_modules 這是因為AWS Lambda不允許我出於未知原因直接從/lib訪問任何二進制文件。 為了在每個部署上執行復制,我deploy.sh下行添加到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庫中應用了相同的內容。 我從谷歌開發者網站下載了它的Linux二進制文件。

就是這個。 我的代碼按預期工作。 如果您對改進它有任何更好的想法,我將不勝感激。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM