2016-08-07 10 views
4

私はヘッドレスブラウジングのためにSpookyJS、CasperJS、PhantomJSツールチェーンを使ってウェブサイトをクロールするために小さなラムダ関数を一緒に投げました。この作業は非常に簡単で、数ヶ月前にラムダで作業していました。私は最近、いくつかのことを変えなければならず、プロジェクトに再び取り組みたいと思っていましたが、新しく始めてラムダをどんなに大きな誤りもなく走らせるのに問題がありました。私の質問はですラムダでファントムを実行するにはどうすればいいですかAWS 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(); 

エラーは次のとおりです。

{ [Error: Child terminated with non-zero exit code 1] details: { code: 1, signal: null } } 

私はすべてを確実にするための様々な手順に従っている上で実行することができますラムダ。推奨されているよう

  • アップロードpackage.jsonとコンパイルのためにアマゾンのLinux EC2インスタンスへのjsファイルを働いている

    1. 実行ローカルnode index.jsを使用して、それを確認します。以下は、私は診断しようとしてきたものの長いリストがありますNPMインストール通話用とEC2インスタンス上here
    2. 実行npm installを説明し、そして再び
    3. がすべてをアップジップ正しい出力を確保するためにnode index.jsを実行して、CLIに
    を使用してAWSにデプロイ

    マイ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インスタンス上ではなく、ラムダの同じエラーで試みた:

    1. しよう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);
    2. 点検産卵がBを呼び出してcasperjsとphantomjsを確保ファントム

    3. の非-prebuiltバージョンはパスからアクセスできますそれは、ローカルおよびEC2上で動作を確認し、

      { '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': {} } 
      
    4. が直接.exec('casperjs').exec('phantomjs --version')を呼び出しますが、ラムダに次のエラーを取得します。yラッピングchild_processの.spawn()コールは、以下のようになりました。コマンド:

      `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) 
    
  • 答えて

    3

    は、私はそれらのためのパスにnode_modules/.binを含むことは、ローカルおよびEC2両方のマシン上で動作することの問題があることが判明しましたファイルはそれぞれのライブラリの/binというフォルダに移動します。これらのファイル内の呼び出しが相対パスを使用すると、これが中断されます。問題:

    [[email protected] .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 
    

    私はラムダハンドラ関数のラムダパスに各ライブラリのそれぞれのビンを追加することでこの問題を回避働い:

    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'; 
    

    そして、これは今では正しくファントム、キャスパー、と不気味を実行しますラムダ。

    +0

    誰かがこれを見つけて同様の問題を抱えている場合。上記の後であっても、私はまだ "0以外の終了コード1で終了した子"に悩まされていました。私はnode_modulesのcasperjsディレクトリに入り、npm_updateを実行しなければなりませんでした。親 – Nick

    関連する問題