Как запустить двоичный файл, например `pdflatex`, на AWS Lambda?

Поскольку AWS Lambda поддерживает запуск двоичных файлов, я хотел запустить pdflatex в AWS Lambda, но я наткнулся на несколько проблем. Я успешно запускал другие двоичные файлы, но pdflatex имеет много зависимостей общих библиотек ОС, и я не мог понять, как заставить его работать.

Пример кода выглядит следующим образом:

'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);
};

И 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

Загруженный ZIP-файл содержит все вышеперечисленное.

Я создал pdflatex с cp $(which pdflatex) pdflatex.

  1. Это правильный способ загрузить pdflatex это? Есть ли проблемы с этим методом? Есть ли способ лучше?

После первой попытки запуска AWS Lambda пожаловался, что многие файлы lib_____.so отсутствуют, поэтому я скопировал их со своего компьютера в папку bin/ внутри ZIP-файла. Я использовал ldd $(which pdflatex) для поиска зависимостей pdflatex.

Однако, как я и предполагал, они были несовместимы с версией Linux, на которой работает AWS Lambda, поэтому я запустил CentOS и скопировал файлы lib______.so в папку bin/, но это тоже не сработало.

  1. Есть ли способ «выгрузить» автономную версию pdflatex, которая содержала бы все необходимые зависимости и работала бы без необходимости использования общих библиотек ОС?

  2. Нужно ли компилировать pdflatex внутри инстанса Amazon Linux? Что, если я скомпилирую его в 64-битной архитектуре, а код запустится в 32-битной архитектуре, не произойдет ли сбой?


person EuAndreh    schedule 13.05.2016    source источник


Ответы (1)


Лучший способ создать двоичные файлы для использования в Lambda — либо скопировать, либо скомпилировать их в той же версии Linux, которую использует Lambda. У Amazon есть список образов AMI здесь: http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html. Создайте экземпляр EC2 из одного из них, установите пакеты и скопируйте файлы в свой zip, как вы сделали.

Для # 2 вы можете упростить зависимости, выполнив статическую компиляцию, но я бы не стал этого делать, если вы не знакомы с сборкой пакетов из исходного кода. Вам нужно будет скомпилировать с -static на этапе компоновки.

person ataylor    schedule 13.05.2016
comment
Спасибо за подсказку про АМИ. Можете ли вы указать мне, как скомпилировать LeTeX с использованием флага -static? - person EuAndreh; 19.05.2016