gpt4 book ai didi

node.js - 如何在 AWS lambda 上安装 phantomjs?

转载 作者:行者123 更新时间:2023-12-03 05:03:36 24 4
gpt4 key购买 nike

我找到了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 的原因是因为我想使用 Node html-pdf library在我的 lambda 中。

我使用的是 Mac。

作为一个答案,我不想克服这个特定错误只是为了发现下一个错误。我正在寻找一个答案,让我在 aws lambda 上工作 phantomjs。如果有另一个 Node “html to pdf”/“html to png”库不需要 phantomjs 即可工作并轻松在 AWS Lambda 上运行,那也是一个可接受的解决方案。

最佳答案

一种解决方案是将 PhantomJS 所需的库包含在 Lambda 函数 .zip 文件中。我会将其分为几个步骤。

确定要包含哪些库

您的错误消息指出缺少共享库。让我们通过将 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

更新 Lambda

将目录中的 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 文件,包括 native 库和 font.conf:

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

-y 选项将符号链接(symbolic link)存储为链接而不是引用的文件。为了节省空间,请确保 .zip 文件中不包含 .git 目录。

测试 Lambda

在 AWS Lambda 控制台中,上传新的 Lambda 函数 .zip 文件并测试 Lambda 函数。 PhantomJS 现在应该可以正常运行,并且您的函数应该返回“hello from phantom!”如果没有,请检查 PhantomJS 子进程返回的 stderr 以获取信息。

您可能需要修改 fonts.conf 和/或包含其他文件才能正确呈现字体。

关于node.js - 如何在 AWS lambda 上安装 phantomjs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com