Одним из решений является включение библиотек, требуемых 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
и / или включить дополнительные файлы для правильной визуализации шрифтов.