2016-10-15 4 views
0

Я пытаюсь заставить casperjs работать с моей функцией AWS Lambda.CasperJS и AWS Lambda

{ 
"errorMessage": "Cannot find module 'casper'", 
"errorType": "Error", 
"stackTrace": [ 
"Function.Module._load (module.js:276:25)", 
"Module.require (module.js:353:17)", 
"require (internal/module.js:12:17)", 
"Object.<anonymous> (/var/task/index.js:3:14)", 
"Module._compile (module.js:409:26)", 
"Object.Module._extensions..js (module.js:416:10)", 
"Module.load (module.js:343:32)", 
"Function.Module._load (module.js:300:12)", 
"Module.require (module.js:353:17)" 
] 
} 

Я продолжаю получать эту ошибку, когда Лямбда не может обнаружить casperjs. Я загрузил свой zip-файл в Lambda и установил модули casperjs в свой каталог, прежде чем я закрепил файлы.

В моем файле package.json указано, что у меня установлены casperjs.

{ 
"name": "lambda", 
"version": "1.0.0", 
"description": "", 
"main": "index.js", 
"scripts": { 
"test": "echo \"Error: no test specified\" && exit 1" 
}, 
"keywords": [], 
"author": "", 
"license": "ISC", 
"dependencies": { 
"casperjs": "^1.1.3", 
} 
} 

Может кто-нибудь знать, что я делаю неправильно? Благодарю.

ответ

3

С CasperJs полагается на PhantomJs, вы можете настроить его очень подобно этому репо: https://github.com/TylerPachal/lambda-node-phantom.

Главное отличие в том, что вам нужно добавить и настроить CasperJs, и вам нужно убедиться, что CasperJs может найти и загрузить PhantomJs.

  1. Создайте каталог node_modules в каталоге своего пакета.

  2. Добавить зависимость для CasperJs в файл packages.json:

    "dependencies": { 
        "casperjs": "latest" 
    } 
    
  3. В терминале, перейдите в директорию пакета и запустить «NPM обновление», чтобы добавить пакет CasperJs в каталог node_modules.

  4. Предполагая, что вы хотите запустить CasperJs с аргументом «тест», то 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 casperjs 
        var casperPath = path.join(__dirname, 'node_modules/casperjs/bin/casperjs'); 
    
        // Arguments for the casper script 
        var processArgs = [ 
         'test', 
         path.join(__dirname, 'casper_test_file.js') 
        ]; 
    
        // Launch the child process 
        childProcess.execFile(casperPath, processArgs, function(error, stdout, stderr) { 
         if (error) { 
          context.fail(error); 
          return; 
         } 
         if (stderr) { 
          context.fail(error); 
          return; 
         } 
         context.succeed(stdout); 
        }); 
    } 
    

    Если вы не хотите, чтобы запустить CasperJs с аргументом 'test', просто удалите его из списка аргументов.

  5. Бинарный файл PhantomJs в корневом каталоге вашего пакета должен быть переименован в phantomjs, так что CasperJs может его найти. Если вы хотите получить новую версию PhantomJs, вы можете получить ее здесь: . Обязательно загрузите тип linux-x86_64.tar.bz2, чтобы он мог работать в Lambda. После загрузки просто вытащите новый двоичный файл из каталога bin и поместите его в каталог корневого пакета.

  6. Для того чтобы Лямбда имела разрешение на доступ ко всем файлам, проще всего закрепить пакет в Unix-подобной операционной системе. Убедитесь, что все файлы в пакете имеют права на чтение и выполнение.Внутри каталога пакета: chmod -R o+rx *. Затем застегните его: zip -r my_package.zip *.

  7. Загрузите пакет в молнию в вашу функцию лямбда.

+0

Это великолепно работает, но мне пришлось прикрепить фантомные шпионы к 1.9.8 - более поздние версии не сработают на Лямбде. – awendt

1

Согласно Документам Casper.js, это не фактически модуль узла. Поэтому вы не можете потребовать его в Package.json и закрепить его узлами. Вам нужно будет найти, как установить его на экземпляр lambda или найти фактический модуль узла, который делает то, что вы хотите. Я подозреваю, что установка на лямбда, возможно, будет невозможна, но это только моя кишка.

Предупреждение Хотя CasperJS является устанавливаемым с помощью НПМ, это не модуль NodeJS и не будет работать с NodeJS из коробки. Вы не можете загрузить casper, используя require ('casperjs') в узле. Обратите внимание, что CasperJS не может использовать подавляющее большинство модулей NodeJS. Экспериментируйте и используйте свое лучшее суждение.

http://docs.casperjs.org/en/latest/installation.html