Узлу ImageMagick удается локально, но в AWS Lambda происходит сбой - PullRequest
0 голосов
/ 18 декабря 2018

Я использую этот 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 }

Это после того, как я не смог использовать ImageMagick, который был встроен.для AWS Lambda.Любая идея, как я могу решить это?

1 Ответ

0 голосов
/ 08 января 2019

Наконец-то я понял это!Для этого нет короткого пути.Вот что я в итоге сделал:

  • Я запустил Parallel на своем Mac и установил двоичные файлы ImageMagick на виртуальную CentOS машину.Для установки бинарных файлов я следовал инструкциям на официальном сайте .Я написал много команд на своей виртуальной машине, но я могу обобщить их в:

    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/`
    
  • Затем я скопировал установочную папку с виртуальной машины в папку, которую я назвал /libв моем корневом каталоге хранилища AWS Lambda.

  • Затем, чтобы использовать новые двоичные файлы, мне нужно было копировать папку ImageMagick из /lib в мой node_modules при каждом развертывании,Это потому, что AWS Lambda не позволил мне получить доступ к любому двоичному файлу из /lib напрямую по неизвестной причине.Чтобы выполнить копирование при каждом развертывании, я добавил в свой файл deploy.sh следующую строку:

    `cp -R ./lib/imagemagick ./node_modules/imagemagick`
    
  • Теперь двоичные файлы готовы к использованию, но AWS Lambda нене разрешите мне запускать какие-либо команды непосредственно из node_modules.Поэтому каждый раз, когда мне нужно было выполнить определенную команду, мне нужно было скопировать ее (это двоичный файл) в папку /tmp, а затем мне нужно было изменить ее режим chmod, чтобы можно было ее запустить.Это код для каждой необходимой команды (в узле):

    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 с сайта разработчиков Google .

Вот и все.Мой код работает как положено.Если у вас есть идеи по улучшению, я буду признателен за комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...