【问题标题】:PhantomJS in AWS Lambda (Missing libfontconfig)AWS Lambda 中的 PhantomJS(缺少 libfontconfig)
【发布时间】:2018-05-16 04:00:12
【问题描述】:

我正在尝试让我的 lambda 函数使用 phantomjs,但是它一直遇到缺少依赖项的错误:libfontconfig / fontconfig。在我的 Centos VPS 上,当我安装 fontconfig (dnf install fontconfig -y) 时,我的代码运行良好。但是,在 lambda 上运行时,我无法弄清楚如何让这个库与我的函数一起运行。

这是我的代码:(试图通过使用 phantomjs 的 AliExpress 包获得最畅销的产品)

const aliExpress = require('aliexpress');

exports.handler = (event, context, callback) => {
    console.log('Handler ran!');
    aliExpress.BestSelling.get().then((goods) => {
        console.log('Found results!');
        const urls = [];
        for(let index in goods) {
            const url = goods[index].url;
            urls.push(url);
        }
        console.log('Returning URLs:');
        console.log(urls);
        callback(null, urls);
    }).catch((err) => {
        console.log('Error:');
        console.log(err);
        callback(err);
    });
};

// For testing on VPS
exports.handler(null, null, (err, result) => {
    if(err) {
        console.log('Err:');
        console.log(err);
    } else {
        console.log('Result:');
        console.log(result);
    }
});

我希望结果是 AliExpress URL 的数组,每当我在 VPS 上安装 fontconfig 运行它时都会发生这种情况。但是,在我的 lambda 函数和没有安装 fontconfig 的 VPS 上,我收到了这个错误:

Handler ran!
(node:1966) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Error reading from stdin: Error: write EPIPE
(node:1966) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
error: /home/function/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory

我相信我现在要么必须 1) 弄清楚如何在没有此依赖项的情况下运行 phantomjs,要么 2) 弄清楚如何将此依赖项安装到我的 Lambda 函数的“服务器”

也许以前版本的 phantomjs 可以提供我想要的功能而无需这种依赖?不确定

有人知道我该如何解决这个问题吗?谢谢!

【问题讨论】:

  • 尝试提供预编译版本而不是安装它,例如phantomjs.org/download.html
  • 另外,您可能应该知道 PhantomJS 不再被开发/维护。除此之外,您没有获得任何嵌入式 Webkit 引擎的安全更新。托管一个任意过时的基于 Webkit 并连接到第三方网站的东西可能不是一个好主意——尤其是当它遇到广告(恶意软件)时。

标签: node.js amazon-web-services lambda npm phantomjs


【解决方案1】:

您可以在控制台中输入:

$ sudo yum install fontconfig

这将安装所需的库。

【讨论】:

  • 您不能在 Lambda 上执行此操作。
  • 这个答案需要更多的上下文。当然,它会安装库,但您缺少的是 OP 需要将 cp 文件放到 lambda 函数项目文件中的 lib 目录中。
【解决方案2】:

这是我刚刚使用 pandoc/xelatex 在 AWS Lambda 上为自定义字体工作的内容。我敢打赌,你可以调整它来为你的用例做类似的事情。

我在我的项目中创建了一个fonts 目录并将我的所有字体都放在那里。同样在该目录中,我创建了一个 fonts.conf 文件,如下所示:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/var/task/fonts/</dir>
  <cachedir>/tmp/fonts-cache/</cachedir>
  <config></config>
</fontconfig>

然后在我的(基于 node.js 的)处理函数中,在调用 pandoc 之前,我设置了一个 ENV var 来告诉 fontconfig 在哪里可以找到字体。

process.env.FONTCONFIG_PATH='/var/task/fonts'

这样做之后,我可以在我的模板中按名称(仅 Bitter)引用字体,例如 Bitter,然后 pandoc/xelatex/fontconfig/whatever 知道要使用哪个版本的字体(例如 @987654328 @ vs Bitter-Italic.otf) 基于任何文本应该具有的样式。

我是根据这个项目中关于让 RSVG 在 Lambda 上使用自定义字体的技巧来解决这个问题的:https://github.com/claudiajs/rsvg-convert-aws-lambda-binary/blob/master/README.md#using-custom-fonts

【讨论】:

  • 对我来说就像一个魅力!实际上我的 phantomJs 是一个依赖项(封装字体和运行时的东西),所以我只需要将 fonts.conf 文件放入该依赖项的 /font 目录中,然后将路径 /var/task/node_modules/MY_DEPENDENCY/fonts 和我来啦 ! (当然,正确的 FONTCONFIG_PATH 也指向该 node_module 文件夹)
【解决方案3】:

对于那些最终到达那里的人,这是我的小故事:我想在 AWS Lambda 执行上使用 Roboto 字体生成基于 html 模板的 PDF 和 phantomJs。

我的应用程序“App”在 nodeJs 中,并且依赖于“RunTimeDep”依赖项,它在运行时为 App 执行一堆有用的东西。在这些任务中,它会生成一个基于 html 模板的 PDF,我想在其中使用 Roboto Mono。顺便提一下,html模板在“App”中。

为此,我创建了 /fonts 文件夹作为“RunTimeDep”模块中提到的@Jeremy Green。我将 Roboto 字体转换为 PFB 格式,并将它们放在那里。我因此添加了这个 fonts.conf:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/var/task/node_modules/RunTimeDep/fonts/</dir>
  <cachedir>/tmp/fonts-cache/</cachedir>
  <config></config>
</fontconfig>

最后,我添加了 FONTCONFIG_PATH 以指向 /var/task/node_modules/RunTimeDep/fonts/(我使用了无服务器环境变量,但 process.env 也应该没问题)

这实际上效果很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2019-05-05
    • 2021-12-16
    相关资源
    最近更新 更多