2015-07-31 7 views
6

Jeśli jest to przypadek użycia Lambdy w niewłaściwy sposób, proszę dać mi znać.Jak mogę spakować lub zainstalować cały program, aby działał w funkcji AWS Lambda?

Chcę zainstalować Scrapy w funkcji Lambda i wywołać funkcję, aby rozpocząć indeksowanie. Mój pierwszy problem polega na tym, jak go zainstalować, aby wszystkie ścieżki były poprawne. Zainstalowałem program, używając katalogu, który ma być spakowany jako root, więc zip zawiera wszystkie pliki źródłowe i plik wykonywalny. Opieram swoje wysiłki na artykule this. W wierszu, który mówi, że należy zawrzeć na początku mojej funkcji, skąd pochodzi zmienna "proces"? Próbowałem,

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

ale pojawia się błąd,

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

Czy muszę zawierać wszystkich plików bibliotecznych, lub po prostu wykonywalny z katalogu/usr/lib? Jak dołączyć tę linię kodu, o której mówi artykuł?

Edit: Próbowałem przeniesienie kodu do child_process.exec i otrzymał błąd

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

Oto mój obecny, cała funkcja

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

Jest to przykład jak "Running R Statystyki w AWS Lambda" ze wszystkich etapów: http://nafiux.com/blog/2015/09/11/running-r-statistics-in- aws-lambda/ –

+0

@michaelAdam byłeś w stanie rozwiązać ten problem? Mam dokładnie ten sam problem –

+0

HI @michaelAdam, wygląda na to [ta odpowiedź poniżej] (https://stackoverflow.com/a/40259180/39396) jest poprawna; czy rozważałeś zaakceptowanie jednej z odpowiedzi na swoje pytanie? –

Odpowiedz

7

Możesz zdecydowanie wykonać dowolne procesy z kodu Node w Lambda. Robimy to, aby uruchomić serwer gry, który na przykład przetwarza obrót gracza. Nie jestem do końca pewien, co próbujesz osiągnąć za pomocą Scrapy, ale pamiętaj, że cała Twoja inicjacja Lambda może teraz żyć tylko przez 60 sekund w AWS! Ale jeśli jest to w porządku dla ciebie, tutaj jest całkowicie działający przykład tego, jak wykonujemy nasz własny arbitralny proces Linux-a z Lambdy. (W naszym przypadku jest to skompilowany plik binarny - naprawdę nie ma znaczenia, o ile masz coś, co można uruchomić na obrazie Linuksa, którego używają).

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

Całe to kopiowanie robimy do/tmp i tak, ponieważ proces, który prowadzimy, oczekuje, że jego własna lokalizacja jest zapisywalna - ale masz pomysł. –

+0

Teraz maksymalna ilość czasu, przez który lambda może przeżyć, wynosi 5 minut. – ainsausti

1

Oto funkcja lambda, który działa skrypt Pythona ustawiający bieżący katalog roboczy na ten sam katalog, co funkcja Lambda. Możesz być w stanie użyć tego z pewnymi modyfikacjami do względnej lokalizacji twojego skryptu Pythona.

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

To naprawdę nie jest to, czego szukam. Mogę łatwo uruchomić pojedynczy skrypt Pythona, umieszczając go obok funkcji LAMDA w spakowanym katalogu.Zastanawiam się, czy możliwe jest dołączenie całej biblioteki Pythona (lub innego języka) do pliku ZIP w taki sposób, aby lambda mogła z niego korzystać. – michaelAdam

4

problem ze swoim przykładzie modyfikuje node global variableprocess przez

var process = require('child_process');

W ten sposób nie można zmienić zmienną środowiskową PATH, a tym samym, dlaczego są coraz Cannot read property 'PATH' of undefined.

Po prostu użyj innej nazwy dla załadowanej biblioteki child_process, np.

//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',......