2015-07-31 15 views
6

Nếu đây là trường hợp sử dụng Lambda hoàn toàn sai, vui lòng cho tôi biết.Làm cách nào để gói hoặc cài đặt toàn bộ chương trình chạy trong chức năng AWS Lambda

Tôi muốn cài đặt Scrapy vào một hàm Lambda và gọi hàm để bắt đầu thu thập dữ liệu. Vấn đề đầu tiên của tôi là làm thế nào để cài đặt nó, để tất cả các đường dẫn là chính xác. Tôi đã cài đặt chương trình bằng cách sử dụng thư mục để được nén như là thư mục gốc của nó, do đó, zip chứa tất cả các tệp nguồn và tệp thực thi. Tôi đang dựa trên nỗ lực của mình trên this bài viết. Trong dòng nó nói để bao gồm vào lúc bắt đầu chức năng của tôi, biến "process" xuất phát từ đâu? Tôi đã cố gắng,

var process = require('child_process'); 
var exec = process.exec; 
process.env['PATH'] = process.env['PATH'] + ':' + 
process.env['LAMBDA_TASK_ROOT'] 

nhưng tôi nhận được lỗi,

"errorMessage": "Cannot read property 'PATH' of undefined", 
"errorType": "TypeError", 

Tôi có cần phải bao gồm tất cả các tập tin thư viện, hoặc chỉ thực thi từ/usr/lib? Làm thế nào để tôi bao gồm một dòng mã mà bài viết nói tôi cần?

Edit: tôi đã cố gắng di chuyển mã vào một child_process.exec, và đã nhận lỗi

"errorMessage": "Command failed: /bin/sh: process.env[PATH]: command not found\n/bin/sh: scrapy: command not found\n" 

Đây là hiện tại, toàn bộ chức năng của tôi

console.log("STARTING"); 
var process = require('child_process'); 
var exec = process.exec; 

exports.handler = function(event, context) {  
    //Run a fixed Python command. 
    exec("process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT']; scrapy crawl backpage2", function(error, stdout) { 
     console.log('Scrapy returned: ' + stdout + '.'); 
     context.done(error, stdout); 
    }); 

}; 
+0

Có một ví dụ về cách "Chạy R kê trong AWS Lambda" với tất cả các bước sau: http://nafiux.com/blog/2015/09/11/running-r-statistics-in- aws-lambda/ –

+0

@michaelAdam bạn có thể giải quyết vấn đề này không? Tôi gặp vấn đề tương tự chính xác –

+0

HI @michaelAdam, có vẻ như [câu trả lời dưới đây] (https://stackoverflow.com/a/40259180/39396) là chính xác; bạn đã xem xét chấp nhận một trong những câu trả lời cho câu hỏi của bạn chưa? –

Trả lời

7

Bạn chắc chắn có thể thực thi các quy trình tùy ý từ mã nút của bạn trong Lambda. Chúng tôi đang thực hiện điều này để chạy một máy chủ trò chơi xử lý lượt phát, ví dụ: Tôi không chắc chắn chính xác những gì bạn đang cố gắng thực hiện với Scrapy, nhưng hãy nhớ rằng toàn bộ cuộc gọi Lambda của bạn chỉ có thể tồn tại trong tối đa 60 giây ngay bây giờ trên AWS! Nhưng nếu đó là OK cho bạn, đây là một ví dụ hoàn toàn làm việc về cách chúng tôi đang thực hiện quá trình linux tùy ý của chúng ta từ Lambda. (Trong trường hợp của chúng tôi, nó là một nhị phân biên dịch - thực sự không quan trọng miễn là bạn có một cái gì đó có thể chạy trên hình ảnh Linux mà họ sử dụng).

var child_process = require('child_process'); 
var path = require('path'); 

exports.handler = function (event, context) { 
    // If timeout is provided in context, get it. Otherwise, assume 60 seconds 
    var timeout = (context.getRemainingTimeInMillis && (context.getRemainingTimeInMillis() - 1000)) || 60000; 
    // The task root is the directory with the code package. 
    var taskRoot = process.env['LAMBDA_TASK_ROOT'] || __dirname; 
    // The command to execute. 
    var command; 

    // Set up environment variables 
    process.env.HOME = '/tmp'; // <-- for naive processes that assume $HOME always works! You might not need this. 

    // On linux the executable is in task root/__dirname, whichever was defined 
    process.env.PATH += ':' + taskRoot; 
    command = 'bash -c "cp -R /var/task/YOUR_THING /tmp/; cd /tmp; ./YOUR_THING ARG1 ARG2 ETC"' 

    child_process.exec(command, { 
     timeout: timeout, 
     env: process.env 
    }, function (error, stdout, stderr) { 
     console.log(stdout); 
     console.log(stderr); 
     context.done(null, {exit: true, stdout: stdout, stderr: stderr}); 
    }); 
}; 
+0

Chúng tôi thực hiện tất cả việc sao chép vào/tmp và như vậy bởi vì quá trình chúng tôi đang chạy dự kiến ​​vị trí riêng của nó có thể ghi được - nhưng bạn có ý tưởng. –

+0

Bây giờ, số lượng thời gian tối đa mà một lambda có thể còn sống là 5 phút. – ainsausti

1

Đây là một chức năng Lambda chạy một tập lệnh python thiết lập thư mục làm việc hiện tại vào cùng thư mục với hàm Lambda. Bạn có thể sử dụng điều này với một số sửa đổi cho vị trí tương đối của tập lệnh python của bạn.

var child_process = require("child_process"); 

exports.handler = function(event, context) { 
    var execOptions = { 
     cwd: __dirname 
    }; 
    child_process.exec("python hello.py", execOptions, function (error, stdout, stderr) { 
     if (error) { 
      context.fail(error); 
     } else { 
      console.log("stdout:\n", stdout); 
      console.log("stderr:\n", stderr); 
      context.succeed(); 
     } 
    }); 
}; 
+1

Đó không thực sự là những gì tôi đang tìm kiếm. Tôi có thể chạy một kịch bản python đơn giản chỉ bằng cách đặt nó cạnh hàm lamda trong thư mục nén.Tôi tự hỏi nếu nó có thể bao gồm một toàn bộ python (hoặc bất kỳ ngôn ngữ khác cho rằng vấn đề) thư viện trong zip theo cách như vậy mà lambda có thể sử dụng nó. – michaelAdam

4

Vấn đề với ví dụ của bạn được sửa đổi node global variableprocess bởi

var process = require('child_process');

Bằng cách này bạn không thể thay đổi biến môi trường PATH, và do đó lý do tại sao bạn đang nhận được Cannot read property 'PATH' of undefined.

Chỉ cần sử dụng tên khác cho thư viện được tải child_process, ví dụ:

//this gets updated to child_process 
var child_process = require('child_process'); 
var exec = child_process.exec; 

//global process variable is still accessible 
process.env['PATH'] = process.env['PATH'] + ':' + 
process.env['LAMBDA_TASK_ROOT'] 

//start new process with your binary 
exec('path/to/your/binary',...... 
Các vấn đề liên quan