小さなLambda関数を一緒に投げて、ヘッドレスブラウジング用のSpookyJS、CasperJS、およびPhantomJSツールチェーンを使用してWebサイトをクロールしました。タスクは非常に単純で、数か月前のある時点でラムダで機能していました。最近、いくつかの変更を加える必要があり、プロジェクトに再度取り組みたいと思いましたが、最初からやり直して、Lambdaをエラーなしで実行するのに問題がありました。私の質問は、Lambdaでphantomjsを実行するにはどうすればよいですか?
私が実行しているサンプルコードは次のとおりです。
spooky.start('http://en.wikipedia.org/wiki/Spooky_the_Tuff_Little_Ghost');
spooky.then(function () {
this.emit('hello', 'Hello, from ' + this.evaluate(function () {
return document.title;
}));
});
spooky.run();
Lambdaで発生するエラーは次のとおりです。
{ [Error: Child terminated with non-zero exit code 1] details: { code: 1, signal: null } }
私はさまざまな手順に従って、すべてがLambdaで実行できるようにしました。以下は私が診断しようとしたものの長いリストです:
node index.js
してローカルで実行し、機能していることを確認しますnpm install
ec2インスタンスで実行し、再度実行node index.js
して正しい出力を確認します私のpackage.jsonは次のとおりです。
{
"name": "lambda-spooky-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"casperjs": "^1.1.3",
"phantomjs-prebuilt": "^2.1.10",
"spooky": "^0.2.5"
}
}
また、次のことも試みました(ほとんどはローカルで、AWS EC2インスタンスでも機能しますが、Lambdaでも同じエラーが発生します:
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'] + ':' + process.env['LAMBDA_TASK_ROOT'] + '/node_modules/.bin'; console.log( 'PATH: ' + process.env.PATH );
child_processの.spawn()
呼び出しをラップしてスポーン呼び出しを検査すると、次のようになります。
{ '0': 'casperjs',
'1':
[ '/var/task/node_modules/spooky/lib/bootstrap.js',
'--transport=http',
'--command=casperjs',
'--port=8081',
'--spooky_lib=/var/task/node_modules/spooky/lib/../',
'--spawnOptions=[object Object]' ],
'2': {} }
直接呼び出して.exec('casperjs')
、.exec('phantomjs --version')
ローカルおよびEC2で機能することを確認しますが、Lambdaで次のエラーが発生します。コマンド:
`require('child_process').exec('casperjs', (error, stdout, stderr) => {
if (error) { console.error('error: ' + error); }
console.log('out: ' + stdout);
console.log('err: ' + stderr);
});
両方とも次の結果になります。
err: Error: Command failed: /bin/sh -c casperjs
module.js:327
throw err;
^
Error: Cannot find module '/var/task/node_modules/lib/phantomjs'
at Function.Module._resolveFilename (module.js:325:15)
at Function.Module._load (module.js:276:25)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/var/task/node_modules/.bin/phantomjs:16:15)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
2016-08-07T15:36:37.349Z b9a1b509-5cb4-11e6-ae82-256a0a2817b9 sout:
2016-08-07T15:36:37.349Z b9a1b509-5cb4-11e6-ae82-256a0a2817b9 serr: module.js:327
throw err;
^
Error: Cannot find module '/var/task/node_modules/lib/phantomjs'
at Function.Module._resolveFilename (module.js:325:15)
at Function.Module._load (module.js:276:25)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/var/task/node_modules/.bin/phantomjs:16:15)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
node_modules/.bin
パスにを含めると、ローカルマシンとec2マシンの両方で機能するという問題が見つかりました。これらのファイル/bin
は、それぞれのライブラリのアクションフォルダーを指しているだけだからです。これらのファイル内の呼び出しが相対パスを使用する場合、これは壊れます。問題:
[ec2-user@ip-172-31-32-87 .bin]$ ls -lrt
total 0
lrwxrwxrwx 1 ec2-user ec2-user 35 Aug 7 00:52 phantomjs -> ../phantomjs-prebuilt/bin/phantomjs
lrwxrwxrwx 1 ec2-user ec2-user 24 Aug 7 00:52 casperjs -> ../casperjs/bin/casperjs
Lambdaハンドラー関数のラムダパスに各ライブラリのそれぞれのビンを追加することで、これを回避しました。
process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT']
+ ':' + process.env['LAMBDA_TASK_ROOT'] + '/node_modules/phantomjs-prebuilt/bin'
+ ':' + process.env['LAMBDA_TASK_ROOT'] + '/node_modules/casperjs/bin';
そして、これはLambdaでファントム、キャスパー、および不気味なものを正しく実行するようになります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加