Запуск GraphicsMagick в приложении AWS Lambda Node не производит вывод - PullRequest
1 голос
/ 02 апреля 2019

У меня есть GraphicsMagick, скомпилированный в каталоге bin моего Node-приложения. Когда я запускаю дочерний процесс для непосредственного запуска gm, я могу получить стандартный вывод и не вижу никаких ошибок.

Тогда я привязал модуль gm. Мое приложение находит gm, потому что если я изменяю путь на gm, я получаю сообщение об ошибке, в котором говорится, что оно не может найти gm. Тем не менее, когда я запускаю код, вставленный ниже, изменение размера не выполняется и не регистрируется сообщение об ошибке. Если я изменю путь к изображению на что-то, что не существует, я все равно не получу ошибок.

const BIN_PATH = `${process.env.LAMBDA_TASK_ROOT}/graphicsmagick/bin/`;
const gm = require('gm');
...

const file = './spec/large.png';
gm(file)
  .resize(240, 240)
  // .autoOrient()
  // .noProfile()
  .write('./resize.png', (err) => {
    if (err) {
      logger.error(err);
      const err2 = createError(err, event, `Failed to resize image ${file}`);
      throw err2;
    }
    logger.info(`done resizing ${file}`);
  });

1 Ответ

1 голос
/ 07 апреля 2019

Я добавил каталог ./graphicsmagick/bin, содержащий gm, в переменную PATH, а также установил переменную среды LD_LIBRARY_PATH. Я скомпилировал GraphicsMagick в Amazon AMI EC2 и добавил его в репозиторий в каталоге ./graphicsmagick.

В EC2 было также установлено несколько общих библиотек, которые мне пришлось скопировать в каталог ./graphicsmagick/lib (в lib уже было несколько файлов, но не все необходимые библиотеки). Я не помню, в каком каталоге содержались общие библиотеки, но, вероятно, это были / usr / lib или / usr / local / lib. Если вы запускаете Lambda на AWS или локально, используя инструмент SAM, он скажет вам, какой файл отсутствует, и простое выполнение `find / -name filename.so 'в EC2 приведет к каталогу, в котором расположен файл. Было 42 файла, которые мне пришлось скопировать в lib.

Я должен также отметить, что позже я добавил проверку, чтобы убедиться, что статус выхода равен 0. Я считаю, что это то, чего не хватало, чтобы иметь возможность узнать, что произошла ошибка.

// Глобально вне обработчика

const BIN_PATH = `${process.env.LAMBDA_TASK_ROOT}/graphicsmagick/bin/`;
process.env.PATH = `${process.env.PATH}:${BIN_PATH}`;

...

//In the handler
      const cmd = 'gm';
      const params = ['convert', sourceFile, '-resize', size, outputFilePath];
      logger.debug({ command: { cmd, params } });
      const childProcess = spawn(cmd, params, {
        env: {
          ...process.env,
          PATH: `./graphicsmagick/bin/:${process.env.PATH}`,
          LD_LIBRARY_PATH: './graphicsmagick/lib',
        },
      });

      childProcess.stdout.on('data', (chunk) => {
        stdOut = `${stdOut}${chunk}`;
      });
      childProcess.stderr.on('data', (chunk) => {
        errorOut = `${errorOut}${chunk}`;
      });
      exitCode = await childProcessPromise({ logger }, event, childProcess);
    } else {
      await copyFile(sourceFile, outputFilePath);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...