捆绑pdflatex以在具有自定义AMI映像的AWS Lambda上运行

时间:2017-07-16 20:35:19

标签: python lambda pdflatex

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

我使用亚马逊的AMI构建了一个EC2实例,并使用yum安装了pdflatex:

yum install texlive-collection-latex.noarch

这样,我可以使用pdflatex和我的python代码,将我的.tex编译成.pdf,就像我想要的那样。

现在,我需要创建一个包含pdflatex工具的.zip文件包; latexcodec(我用过的python库,没问题);和我的python文件:handler(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 - 有没有正确的方法来移动二进制及其所有依赖项,以便可以在其他机器中使用(考虑env变量)?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

samoconnor几乎可以完全按照您在https://github.com/samoconnor/lambdalatex中的要求进行操作。请注意,他在自己的处理程序function

中设置了环境变量
const express = require('express');
const router = express.Router();

// Item Model
const Item = require('../../models/Items');

// route   GET api/items
router.get('/', (req, res) => {
  Item.find()
    .sort({ name: 1 })
    .then(items => res.json(items));
});

// route   POST api/items
router.post('/', (req, res) => {
  const newItem = new Item({
    name: req.body.name,
    email: req.body.email
  });

  newItem.save();
});

module.exports = router;

这也可能为您解决问题。