web-dev-qa-db-ja.com

NodeJSを使用してAWS LambdaでPhantomJSを実行する方法

インターネット上の他の場所で有効な答えが見つからなかった後、私はこの質問と回答-自分のチュートリアルを提出しています

AWS LambdaPhantomJSスクリプトから単純なNodeJSプロセスを実行するにはどうすればよいですか?私のコードはローカルマシンで正常に動作しますが、Lambdaで実行しようとするとさまざまな問題が発生します。

24
Tyler

編集:これはもう機能しませんこれは明らかな解決策です


以下は、PhantomJSchild_processとして起動される単純なNodeJSプロセスの完全なコードサンプルです。 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);
    });
}

phantom-script.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();

AmazonのLinuxマシンで動作するPhantomJSバイナリを取得するには、 PhantomJS Bitbucket Page にアクセスしてphantomjs-1.9.8-linux-x86_64.tar.bz2をダウンロードします。

30
Tyler

一般的なソリューションは、実際のAWS Linuxマシンを使用してnpmモジュールをインストールし、それらをラムダ実行可能ファイルに転送することです。手順は次のとおりです。

  1. eC2インスタンスを起動する
  2. eC2にssh
  3. インストールNode + npm
  4. 必要なnpmモジュールをインストールする
  5. それらをジップアップ
  6. scpを使用してローカルマシンにフェッチします
  7. 解凍してラムダ関数のnpm_modulesフォルダーにコピーします(npmをローカルにインストールしないでください!)
  8. コードをLambdaにアップロードする

以下に、その他のリソースへのリンクを含むチュートリアルを示します。 AWS Lambdaのノードモジュールライブラリのコンパイル

これは、PhantomJSが別のノードモジュールの依存関係である場合にも機能します。 node-webshotを使用すると、インストールされるものに対する影響が少なくなります。

5
David Salamon