如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS

Posted

技术标签:

【中文标题】如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS【英文标题】:How do I run PhantomJS on AWS Lambda with NodeJS 【发布时间】:2016-04-11 06:02:56 【问题描述】:

在互联网上其他任何地方都没有找到有效的答案后,我提交了这个自问自答教程

如何从AWS Lambda 上的NodeJS 脚本运行一个简单的PhantomJS 进程?我的代码在本地机器上运行良好,但尝试在 Lambda 上运行时遇到了不同的问题。

【问题讨论】:

【参考方案1】:

编辑:这不再有效。 This is an apparent solution.


这是一个简单的PhantomJS 进程的完整代码示例,它以NodeJS child_process 的形式启动。 It is also available on github.


index.js

var childProcess = require('child_process');
var path = require('path');

exports.handler = function(event, context) 

    // Set the path as described here: https://aws.amazon.com/blogs/compute/running-executables-in-aws-lambda/
    process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];

    // Set the path to the phantomjs binary
    var phantomPath = path.join(__dirname, 'phantomjs_linux-x86_64');

    // Arguments for the phantom script
    var processArgs = [
        path.join(__dirname, 'phantom-script.js'),
       'my arg'
    ];

    // Launc the child process
    childProcess.execFile(phantomPath, processArgs, function(error, stdout, stderr) 
        if (error) 
            context.fail(error);
            return;
        
        if (stderr) 
            context.fail(error);
            return;
        
        context.succeed(stdout);
    );


幻影脚本.js

var system = require('system');
var args = system.args;

// Example of how to get arguments passed from node script
// args[0] would be this file's name: phantom-script.js
var unusedArg = args[1];

// Send some info node's childProcess' stdout
system.stdout.write('hello from phantom!')

phantom.exit();

要获取适用于亚马逊 Linux 机器的 PhantomJS 二进制文件,请访问 PhantomJS Bitbucket Page 并下载 phantomjs-1.9.8-linux-x86_64.tar.bz2

【讨论】:

很棒的答案@Tyler。 @Tyler 同样,我实现了我的代码。一切都很好,只是它显示我在完成之前退出了进程。我能知道是什么导致了这个问题吗?? 这不再起作用了。这是一个更新的答案:***.com/a/56843029/61624【参考方案2】:

一个通用的解决方案是使用实际的 AWS Linux 机器来安装 npm 模块并将它们传输到您的 lambda 可执行文件。步骤如下:

    启动一个 EC2 实例 ssh 进入 EC2 安装 Node + npm 安装所需的 npm 模块 拉上拉链 使用scp 将它们提取到您的本地计算机 解压并复制到 lambda 函数的 npm_modules 文件夹中(不要在本地安装 npm!) 将您的代码上传到 Lambda

这是一个教程,其中包含指向更多资源的链接: Compile node module libraries for AWS Lambda

当 PhantomJS 是另一个节点模块的依赖项时,这也适用于这种情况,例如。 node-webshot 并且您对正在安装的内容的影响较小。

【讨论】:

谢谢。比公认的答案更有帮助。

以上是关于如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS的主要内容,如果未能解决你的问题,请参考以下文章

使用nodejs中的AWS Lambda函数上传音频文件

如何使用依赖项创建AWS nodejs lambda函数

使用 AWS Lambda (NodeJS) 创建 AWS AppSync

对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?

在 NodeJS + Typescript AWS Lambda 上进行单元测试

使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip