Как вы устанавливаете фантомы на AWS лямбда? - PullRequest
1 голос
/ 27 июня 2019

Я нашел 4-летний проект , который должен устанавливать phantomjs на lambda, но либо я делаю что-то не так, либо что-то изменилось с момента создания репо, и он больше не работает. Когда я клонирую и развертываю этот репозиторий, я получаю эту ошибку, пытаясь запустить phantomjs:

{
  "errorType": "Error",
  "errorMessage": "write EPIPE",
  "code": "EPIPE",
  "stack": [
    "Error: write EPIPE",
    "    at WriteWrap.afterWrite [as oncomplete] (net.js:779:14)"
  ],
  "errno": "EPIPE",
  "syscall": "write"
}

{
  "errorType": "Error",
  "errorMessage": "html-pdf: Received the exit code '127'\n./phantomjs_lambda/phantomjs_linux-x86_64: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory\n",
  "stack": [
    "Error: html-pdf: Received the exit code '127'",
    "./phantomjs_lambda/phantomjs_linux-x86_64: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory",
    "",
    "    at ChildProcess.respond (/var/task/node_modules/html-pdf/lib/pdf.js:121:31)",
    "    at ChildProcess.emit (events.js:189:13)",
    "    at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)"
  ]
}

Если я использую последний бинарный файл linux вместо того, который поставляется с этим репозиторием, я получаю другую, но похожую ошибку об отсутствии другого файла .so.

Для контекста я хочу установить phantomjs, потому что я хочу использовать нод html-pdf library в моей лямбде.

Я на Mac.

В качестве ответа я не собираюсь обходить эту конкретную ошибку, а только обнаруживать следующую. Я ищу ответ, который заставляет меня работать фантомами на AWS Lambda. Если есть другой узел библиотеки «html to pdf» / «html to png», который не требует работы phantomjs и легко запускается на AWS Lambda, это также будет приемлемым решением.

Ответы [ 2 ]

5 голосов
/ 02 июля 2019

Одним из решений является включение библиотек, требуемых PhantomJS, в файл .zip функции Lambda. Я разбью это на несколько шагов.

Определите, какие библиотеки включить

В вашем сообщении об ошибке указано, что общая библиотека отсутствует. Давайте найдем именно то, что ищет PhantomJS, установив его в контейнер Docker и проверив его зависимости во время выполнения. Узел js10.x AWS Lambda Runtime использует Amazon Linux 2, но шаги аналогичны для более ранних версий.

В хост-системе запустите контейнер Amazon Linux 2 Docker:

$ docker run -it --rm amazonlinux:2.0.20190508

В контейнере установите PhantomJS и проверьте его зависимости:

bash-4.2$ yum install -y bzip2 tar
bash-4.2$ curl -LO https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
bash-4.2$ tar xf phantomjs-2.1.1-linux-x86_64.tar.bz2
bash-4.2# ldd ./phantomjs-2.1.1-linux-x86_64/bin/phantomjs 
        linux-vdso.so.1 (0x00007ffdd251f000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f35d0439000)
        libfontconfig.so.1 => not found
        libfreetype.so.6 => not found
        ...

Мы видим, что libfontconfig и libfreetype отсутствуют.

Установить библиотеки

Далее мы загрузим и распакуем необходимые библиотеки, затем скопируем их в хост-систему Обратите внимание, что libfontconfig зависит от libexpat, поэтому мы также установим его.

В контейнере:

bash-4.2$ yum install -y yum-utils rpmdevtools
bash-4.2$ cd /tmp
bash-4.2$ yumdownloader fontconfig.x86_64 freetype.x86_64 expat.x86_64
bash-4.2$ rpmdev-extract *.rpm

Скопируйте библиотеки в каталог:

bash-4.2$ mkdir -p /deps
bash-4.2$ cp /tmp/*/usr/lib64/* /deps

Также скопируйте файл конфигурации fontconfig:

bash-4.2$ cp /tmp/*/etc/fonts/fonts.conf /deps

Затем на хосте получите идентификатор контейнера Docker и скопируйте файлы из контейнера на хост. Ниже lambda-node-phantom - каталог, в котором вы клонировали репозиторий https://github.com/TylerPachal/lambda-node-phantom:

$ cd lambda-node-phantom
$ docker ps
$ docker cp <CONTAINER_ID>:/deps/ .
$ mv deps/* . && rmdir deps

Обновление лямбды

Обновите двоичный файл PhantomJS в вашем каталоге до версии, загруженной в контейнер Docker выше. Убедитесь, что index.js относится к правильному имени для последней версии; в версии 2.1.1 он называется phantomjs.

Затем добавьте следующую строку в index.js, чтобы fontconfig нашел fonts.conf в корневом каталоге Lambda:

process.env['FONTCONFIG_PATH'] = process.env['LAMBDA_TASK_ROOT'];

Наконец, заново создайте .zip-файл функции Lambda, включая собственные библиотеки и font.conf:

$ zip -y /path/to/lambda-node-phantom-dist.zip .

Опция -y сохраняет символические ссылки в виде ссылок вместо ссылочного файла. Чтобы сэкономить место, убедитесь, что каталог .git не включен в файл .zip.

Тест лямбда

В консоли AWS Lambda загрузите новый ZIP-файл функции Lambda и протестируйте функцию Lambda. PhantomJS теперь должен работать без ошибок, а ваша функция должна возвращать «привет из фантома!» Если нет, проверьте информацию stderr, возвращенную дочерним процессом PhantomJS.

Вероятно, вам потребуется изменить fonts.conf и / или включить дополнительные файлы для правильной визуализации шрифтов.

0 голосов
/ 01 июля 2019

Согласно вашей ошибке в журнале, похоже, что libfreetype.so.6 отсутствует в вашей среде выполнения лямбды.

Возможно, вам потребуется создать собственный лямбда-слой, встраивающий эту разделяемую библиотеку.После этого вам может потребоваться обновить LD_LIBRARY_PATH, чтобы он также указывал на каталог общей библиотеки.Вы также можете поочередно включить его в свой пакет развертывания lambda.

Согласно официальному документу AWS:

Чтобы включить библиотеки в слой, поместите их в одну из папок, поддерживаемых вашимвремя выполнения.

Все - bin (PATH), lib (LD_LIBRARY_PATH)

Ссылка здесь: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

Убедитесь, что вы вставили libfreetype.so.6скомпилирован для Amazon Linux (или Amazon Linux 2).

Время выполнения здесь: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...