web-dev-qa-db-fra.com

Comment exécuter PhantomJS sur AWS Lambda avec NodeJS

Après avoir trouvé une réponse qui ne fonctionne nulle part ailleurs sur Internet, je soumets ce tutoriel demander et répondre moi-même

Comment puis-je obtenir un processus PhantomJS simple exécuté à partir d'un script NodeJS sur AWS Lambda? Mon code fonctionne bien sur ma machine locale, mais je rencontre des problèmes différents en essayant de l'exécuter sur Lambda.

24
Tyler

EDIT: Cela ne fonctionne plus . Ceci est une solution apparente .


Voici un exemple de code complet d'un processus PhantomJS simple, qui est lancé en tant que NodeJSchild_process. Il est également disponible sur 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();

Pour obtenir un binaire PhantomJS qui fonctionne avec les machines Linux d'Amazon, accédez à la Page Bitbucket de PhantomJS et téléchargez phantomjs-1.9.8-linux-x86_64.tar.bz2.

30
Tyler

Une solution générique consiste à utiliser une machine AWS Linux réelle pour installer les modules npm et les transférer vers votre exécutable lambda. Voici les étapes:

  1. faire tourner une instance EC2
  2. ssh dans EC2
  3. install Node + npm
  4. installer les modules npm requis
  5. Fermez-les
  6. les récupérer sur votre machine locale avec scp
  7. décompressez et copiez dans le dossier npm_modules de votre fonction lambda (ne pas installer npm localement!)
  8. téléchargez votre code sur Lambda

Voici un tutoriel avec des liens vers d'autres ressources: Compiler les bibliothèques de modules de nœuds pour AWS Lambda

Cela fonctionne également dans de tels cas lorsque PhantomJS est une dépendance d'un autre module de nœud, par exemple. node-webshot et vous avez moins d'influence sur ce qui est installé.

5
David Salamon