运行 AWS Lambda 节点应用程序中的 GraphicsMagick 未产生任何输出

Running GraphicsMagick in AWS Lambda Node app produces no output

我在我的 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}`);
  });

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

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