如何在AWS Lambda上像`pdflatex`这样的二进制文件运行?

EuA*_*reh 3 latex pdflatex amazon-web-services latex-environment aws-lambda

由于AWS Lambda支持运行二进制文件,因此我想pdflatex在AWS Lambda中运行,但是偶然发现了一些问题。我已经成功运行了其他二进制文件,但是pdflatex有许多共享的OS库依赖项,我不知道如何使它工作。

示例代码如下所示:

'use strict';
let exec = require('child_process').exec;

exports.handler = (event, context, callback) => {
  const child = exec('LD_LIBRARY_PATH=bin/ ./pdflatex my-file.tex', (error) => {
    callback(error, 'Process complete!');
  });
  child.stdout.on('data', console.log);
  child.stderr.on('data', console.error);
};
Run Code Online (Sandbox Code Playgroud)

ZIP文件如下所示:

index.js -------------- where the above code is
pdflatex -------------- binary from my OS
my-file.tex ----------- a sample LaTeX document
bin/ ------------------ folder with shared OS libraries
Run Code Online (Sandbox Code Playgroud)

上载的ZIP文件包含上述所有内容。

我生成了pdflatexwith cp $(which pdflatex) pdflatex

  1. 这是上传的正确方法pdflatex吗?这种方法有什么问题吗?有没有更好的办法?

首次尝试运行后,AWS Lambda抱怨说很多东西lib_____.so丢失了,因此我将它们从我的机器复制到bin/ZIP内的文件夹中。我曾经ldd $(which pdflatex)寻找pdflatex的依赖项。

但是,正如我想象的那样,它们与运行AWS Lambda的Linux版本不兼容,因此我启动了CentOS并将lib______.so文件复制到该bin/文件夹,但这也不起作用。

  1. 有没有一种方法可以“转储” pdflatex包含所有必需依赖项并且可以在不需要共享OS库的情况下运行的自包含版本?

  2. 我是否需要pdflatex在Amazon Linux实例中进行编译?如果我将其编译为64位架构并且代码运行在32位架构上怎么办,它不会失败吗?

ata*_*lor 5

生成供Lambda使用的二进制文件的最佳方法是在Lambda使用的同一Linux版本上复制或编译它们。亚马逊在此处提供了AMI图像列表:http : //docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html。从其中一个创建EC2实例,安装软件包,然后将文件复制到zip中。

对于#2,您可以通过执行静态编译来简化依赖关系,但是除非您熟悉从源代码构建软件包,否则我不会尝试这样做。您需要-static在链接阶段进行编译。