【问题标题】:Bundle pdflatex to run on an AWS Lambda with a custom AMI image捆绑 pdflatex 以在带有自定义 AMI 映像的 AWS Lambda 上运行
【发布时间】:2017-07-16 20:35:19
【问题描述】:

我的目标是创建一个 Amazon Lambda 函数,通过 python 使用 pdflatex 工具将 .tex 文件编译成 .pdf。

我已经使用 Amazon 的 AMI 构建了一个 EC2 实例并使用 yum 安装了 pdflatex:

yum install texlive-collection-latex.noarch

这样,我可以使用 pdflatex 并且我的 python 代码可以正常工作,按照我想要的方式将我的 .tex 编译成 .pdf。

现在,我需要创建一个包含 pdflatex 工具的 .zip 文件包; latexcodec(我用过的一个python库,这个没问题);和我的 python 文件:处理程序(lambda 函数处理程序)和 worker(编译我的 .tex 文件)。

此捆绑包是将我的代码和库上传到 Amazon Lambda 所需的部署包。

问题是:pdflatex 有很多依赖项,我必须将所有内容收集在一个地方。我找到了一个可以为我执行此操作的脚本:

http://www.metashock.de/2012/11/export-binary-with-lib-dependencies/

我已设置我的 PATH 以在新目录中查找 pdflatex 二进制文件,以便我可以使用它,但我遇到了一个问题:pdflatex 找不到某些依赖项。我可以通过将环境变量设置为脚本将所有内容移至的文件夹来修复它:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/ec2-user/lambda/local/lib64:/home/ec2-user/lambda/local/usr/lib64"

此时,我正在通过 bash 直接运行 pdflatex。但是我的 python 脚本在尝试使用 pdflatex 时出错:

mktexfmt: No such file or directory
I can't find the format file `pdflatex.fmt'!

我还能够通过将 pdflatex.fmttexmf.cnf 文件移动到我的捆绑文件夹并设置一些环境变量来解决这个问题:

export TEXFORMATS=/home/ec2-user/lambda/local/usr/bin

现在,我当前的问题,python 脚本不断抛出以下错误:

---! /home/ec2-user/lambda/local/usr/bin/pdflatex.fmt doesn't match pdftex.pool
(Fatal format file error; I'm stymied)

我找到了一些可能的解决方案;删除 .texmf-var 文件夹,在我的情况下,该文件夹不存在;使用 fmtutil,我的 AMI 映像中没有它...

1 - 我是否遗漏了任何环境变量?

2 - 或者以错误的方式移动我的 pdflatex 二进制文件及其所有依赖项?

3 - 是否有任何正确的方法可以移动二进制文件及其所有依赖项,以便可以在其他机器上使用(考虑到环境变量)?

【问题讨论】:

    标签: python lambda pdflatex


    【解决方案1】:

    Lambda 环境是一个容器,而不是一个普通的 EC2 实例。 .zip 中的所有文件都部署在容器内的/var/task/ 中。顺便说一句,除了目录/tmp 之外,所有内容都以只读方式挂载。因此,例如,不可能运行yum

    对于您的情况,我建议您将二进制文件放入您的 zip 并在 /var/task/<binary name> 中调用它。请记住将静态编译的二进制文件放在与容器内核兼容的 linux 中。

    【讨论】:

    • 我知道,我正在使用这个实例,因为它与 lambda 函数使用的基础架构相同。所以它不会有任何兼容性问题。但在将所有内容放入 zip 文件之前,我必须确保我的 python 处理程序可以从一个地方使用所有内容(在这种情况下,我的 /home/ec2-user/lambda/local),然后我将其更改为 @987654325 @ 将其全部压缩。当然,一切都是只读的,我正在使用 yum 来设置 pdflatex,所以我可以将它捆绑到我的部署包中
    【解决方案2】:

    samoconnor 在https://github.com/samoconnor/lambdalatex 中所做的几乎完全符合您的要求。请注意,他在他的处理程序function中设置环境变量@

    os.environ['PATH'] += ":/var/task/texlive/2017/bin/x86_64-linux/"
    os.environ['HOME'] = "/tmp/latex/"
    os.environ['PERL5LIB'] = "/var/task/texlive/2017/tlpkg/TeXLive/"
    

    这也可能对你有用。

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      相关资源
      最近更新 更多