2016-01-06 7 views
15

Nachdem keine funktionierende Antwort anderswo im Internet zu finden, ist mir das Absenden dieses fragen-und-Antwort-ich TutorialWie fahre ich PhantomJS auf AWS Lambda mit NodeJS

Wie kann ich eine einfaches PhantomJS bekommen Prozess läuft von einem NodeJS Skript auf AWS Lambda? Mein Code funktioniert gut auf meinem lokalen Computer, aber ich stoße auf verschiedene Probleme, wenn ich versuche, ihn auf Lambda auszuführen.

Antwort

25

Hier ist ein vollständiges Codebeispiel eines einfachen PhantomJS Prozesses, der als NodeJSchild_process gestartet wird. 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); 
    }); 
} 

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(); 

eine PhantomJS binär zu erhalten, die mit Amazon Linux Maschine arbeitet, um das gehen PhantomJS Bitbucket Page und herunterladen phantomjs-1.9.8-linux-x86_64.tar.bz2.

+1

Fantastische Antwort @Tyler. –

+0

@Tyler Im selben habe ich meinen Code implementiert. Alles läuft gut, außer dass es mir zeigt, dass der Prozess vor der Fertigstellung beendet wurde. Kann ich wissen, was dieses Problem verursacht? – Vikas

3

Eine generische Lösung besteht darin, eine tatsächliche AWS Linux-Maschine zu verwenden, um die npm-Module zu installieren und sie an Ihre ausführbare Lambda-Datei zu übertragen. Hier sind die Schritte:

  1. Spin-up eine EC2-Instanz
  2. ssh in EC2
  3. installieren Knoten + npm
  4. installieren Sie die erforderlichen npm Module
  5. sie zip
  6. sie holen, um Ihre lokale Maschine mit scp
  7. entpacken und in den npm_modules-Ordner Ihrer Lambda-Funktion kopieren (nicht npm lokal installieren!)
  8. laden Sie Ihren Code Lambda

Hier ist ein Tutorial mit Links zu weiteren Informationen: Compile node module libraries for AWS Lambda

Dies auch in solchen Fällen funktioniert, wenn PhantomJS eine Abhängigkeit eines anderen Knotenmodul, zB. Knoten-Webshot und Sie haben weniger Einfluss auf das, was installiert wird.

+1

Danke. Viel hilfreicher als die angenommene Antwort. – geotheory