Я добавил каталог ./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);
}