2016-01-06 15 views
15

Sau khi không tìm thấy một câu trả lời làm việc bất cứ nơi nào khác trên internet, tôi trình này hỏi và trả lời-mình hướng dẫnLàm thế nào để chạy PhantomJS trên AWS Lambda với NodeJS

Làm thế nào tôi có thể nhận được một đơn giản PhantomJS quy trình đang chạy từ tập lệnh NodeJS trên AWS Lambda? Mã của tôi hoạt động tốt trên máy cục bộ của tôi, nhưng tôi chạy vào các vấn đề khác nhau cố gắng chạy nó trên Lambda.

Trả lời

25

Đây là mẫu mã hoàn chỉnh của quy trình PhantomJS đơn giản, được khởi chạy dưới dạng NodeJSchild_process. 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(); 

Để có được một nhị phân PhantomJS làm việc với máy Linux của Amazon, hãy chuyển đến PhantomJS Bitbucket Page và tải xuống phantomjs-1.9.8-linux-x86_64.tar.bz2.

+1

Câu trả lời tuyệt vời @Tyler. –

+0

@Tyler Trong cùng một tôi đã thực hiện mã của tôi. Mọi thứ đều ổn, ngoại trừ việc nó cho tôi thấy quá trình đã thoát trước khi hoàn thành. Tôi có thể biết điều gì đang gây ra vấn đề này không ?? – Vikas

3

Giải pháp chung là sử dụng máy AWS Linux thực để cài đặt các mô-đun npm và chuyển chúng sang tệp thực thi lambda của bạn. Dưới đây là các bước:

  1. quay lên một thể EC2
  2. ssh vào EC2
  3. cài đặt Node + NPM
  4. cài đặt các module NPM cần
  5. nén chúng lên
  6. lấy họ của bạn máy cục bộ với scp
  7. giải nén và sao chép vào thư mục npm_modules của hàm lambda (không cài đặt npm cục bộ!)
  8. upload mã của bạn để Lambda

Đây là một hướng dẫn có liên hệ với các nguồn lực hơn nữa: Compile node module libraries for AWS Lambda

này cũng hoạt động trong những trường hợp như vậy khi PhantomJS là một sự phụ thuộc của một mô-đun nút, ví dụ. nút-webshot và bạn có ít ảnh hưởng đến những gì đang được cài đặt.

+1

Cảm ơn bạn. Hữu ích hơn nhiều so với câu trả lời được chấp nhận. – geotheory

Các vấn đề liên quan