在AWS Lambda Node应用中运行GraphicsMagick不会产生任何输出

时间:2019-04-02 00:38:24

标签: node.js aws-lambda imagemagick graphicsmagick

我在Node应用程序的bin目录中编译了GraphicsMagick。当我生成一个子进程直接运行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 个答案:

答案 0 :(得分:1)

我将包含gm的./graphicsmagick/bin目录添加到PATH变量,并且还设置了LD_LIBRARY_PATH环境变量。我在Amazon AMI EC2中编译了GraphicsMagick,并将其添加到./graphicsmagick目录中的仓库中。

在EC2中还安装了几个共享库,我必须将它们复制到./graphicsmagick/lib目录中(lib已经有一些文件,但不是所有必需的库)。我不记得哪个目录包含共享库,但是它可能是/ usr / lib或/ usr / local / lib。如果您在AWS上或使用SAM工具在本地运行Lambda,它将告诉您缺少哪个文件,只需在EC2上执行`find / -name filename.so'就会在文件所在的目录中生成。我必须将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);
    }