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

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

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

【问题讨论】:

    标签: node.js amazon-web-services phantomjs aws-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 同样,我实现了我的代码。一切都很好,只是它显示我在完成之前退出了进程。我能知道是什么导致了这个问题吗??
    • 这不再起作用了。这是一个更新的答案:stackoverflow.com/a/56843029/61624
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。比公认的答案更有帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 2019-07-02
    • 2020-10-06
    • 2020-08-06
    • 2019-09-05
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多