我发现一个4 year old project应该在lambda上安装phantomjs,但是我做错了什么,或者自从创建回购以来事情发生了变化,并且不再起作用。克隆并部署此存储库时,尝试运行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的原因是因为我想在我的lambda中使用节点html-pdf library。
我在Mac上。
作为回答,我不是想越过这个特定的错误,而只是发现下一个错误。我正在寻找一个答案,可以让我在AWS Lambda上运行phantomjs。如果存在另一个不需要phantomjs就能轻松在AWS Lambda上运行的“ html to pdf” /“ html to png”库节点,那也是可以接受的解决方案。
答案 0 :(得分:4)
一种解决方案是在Lambda函数.zip文件中包含PhantomJS所需的库。我将其分为几个步骤。
您的错误消息指出缺少共享库。让我们通过将PhantomJS安装在Docker容器中并检查其运行时依赖关系来确切地找到PhantomJS的需求。 nodejs10.x AWS Lambda运行时使用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容器ID,并将文件从容器复制到主机。下面的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在Lambda根目录中找到fonts.conf
:
process.env['FONTCONFIG_PATH'] = process.env['LAMBDA_TASK_ROOT'];
最后,重新创建Lambda函数.zip文件,包括本地库和font.conf
:
$ zip -y /path/to/lambda-node-phantom-dist.zip .
-y
选项将符号链接存储为链接,而不是引用的文件。为了节省空间,请确保{.1文件中没有包含.git
目录。
在AWS Lambda控制台中,上传新的Lambda函数.zip文件并测试Lambda函数。 PhantomJS现在应该运行没有错误,并且您的函数应该返回“ hello from phantom!”。如果没有,请检查PhantomJS子进程返回的stderr
以获取信息。
您可能需要修改fonts.conf
和/或包括其他文件才能正确呈现字体。
答案 1 :(得分:0)
根据您的日志错误,您的lambda执行运行时似乎缺少libfreetype.so.6。
您可能需要创建一个嵌入此共享库的自定义lambda层。之后,您可能需要更新LD_LIBRARY_PATH,以便它也指向共享库的目录。您也可以选择将其包含在lambda部署程序包中。
根据AWS官方文档:
要将库包含在层中,请将它们放置在运行时支持的文件夹中。
全部-bin(PATH),lib(LD_LIBRARY_PATH)
链接在这里:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
确保您嵌入了针对Amazon Linux(或Amazon Linux 2)编译的libfreetype.so.6。
此处的执行运行时:https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
祝你好运!