AWS Lambda robi miniaturki wideo

Chcę robić miniaturki z filmów wgrywanych Na S3, wiem jak to zrobić z Node.js i ffmpeg.

Zgodnie z ten post na forum Mogę dodać biblioteki:

ImageMagick jest jedyną zewnętrzną biblioteką dostarczaną obecnie przez domyślne, ale możesz dołączyć dodatkowe zależności W zip plik podany podczas tworzenia funkcji Lambda. Zauważ, że jeśli to jest natywną biblioteką lub wykonywalną, musisz upewnić się, że działa na Amazon Linux.

Ale jak Mogę umieścić statyczny FFmpeg binarny na aws lambda?

I jak mogę zadzwonić z Node.js ten statyczny binarny (ffmpeg) z AWS Lambda?

Jestem newbie z amazon AWS i Linux

Czy ktoś może mi pomóc?

Author: Yves M., 2014-12-30

7 answers

Proces opisany przez naveena jest poprawny, ale pokazuje szczegóły, które mogą być dość bolesne - włączając w to plik binarny ffmpeg w zip i dostęp do niego w ramach funkcji lambda.

Właśnie przez to przechodziłem, poszło tak:

  1. Dołącz statyczny plik binarny ffmpeg do spakowanego pakietu funkcji lambda (mam zadanie gulp, aby skopiować to do /dist za każdym razem, gdy buduje)
  2. Po wywołaniu funkcji Przenieś plik binarny do katalogu /tmp/ i chmod to dać sobie dostęp (Aktualizacja Luty 2017: poinformowano, że nie jest to już konieczne, re: @loretoparisi i @allen'S odpowiedzi).
  3. zaktualizuj swoją ścieżkę, aby zawierała plik wykonywalny ffmpeg (użyłem fluent-FFmpeg, który pozwala ustawić dwa ENV vary, aby obsłużyć to łatwiej.

Daj mi znać, jeśli potrzeba więcej szczegółów, mogę zaktualizować tę odpowiedź.

Kopia i chmod (Krok 2) oczywiście nie są idealne.... chciałbym wiedzieć, czy ktoś znalazłem lepszy sposób na poradzenie sobie z tym, lub jeśli jest to typowe dla tego stylu architektury.

Nie jest to jednak żaden problem, ponieważ nie jest to możliwe.]}

Krok copy + chmod nie jest już potrzebny, jak zauważył @Allen-wykonuję FFmpeg w funkcjach Lambda bezpośrednio z /var/ task / bez żadnych problemów w tym momencie. Upewnij się, że chmod 755 cokolwiek binaria przed przesłaniem ich do Lambda (również jak zauważył @Allen).

Nie używam już fluent-ffmpeg do do roboty. Raczej aktualizuję ścieżkę, aby zawierała process.env['LAMBDA_TASK_ROOT'] i wykonuję proste skrypty bash.

U góry funkcji Lambda:

process.env['PATH'] = process.env['PATH'] + "/" + process.env['LAMBDA_TASK_ROOT']

Dla przykładu używającego ffmpeg: lambda-pngs-to-mp4 .

Dla mnóstwa użytecznych składników lambda: lambduh .

Nie jest to już konieczne, ponieważ nie jest to konieczne.]}

AKTUALIZACJA ZE SZCZEGÓŁAMI:

Ściągnąłem statyczny plik binarny ffmpeg tutaj . Amazonka zaleca uruchomienie EC2 i zbudowanie na nim pliku binarnego, ponieważ środowisko to będzie takie samo jak warunki, na których działa Lambda. Prawdopodobnie dobry pomysł, ale więcej pracy, a to statyczne pobieranie działało dla mnie.

Wyciągnąłem tylko ffmpeg plik binarny do folderu mojego projektu, który ma być zarchiwizowany /dist.

Kiedy wgrasz swój zip do lambda, mieszka on w /var/task/. Z jakiegokolwiek powodu napotkałem problemy z dostępem, próbując użyć binarnego w tej lokalizacji, i więcej problemów próbuje edytować prawa dostępu do tego pliku. Szybkie obejście polega na przeniesieniu pliku binarnego do /tmp/ i chmod uprawnień na nim.

W Node można uruchomić powłokę za pomocą child_process. To co zrobiłem wygląda tak:

require('child_process').exec(
  'cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg;',
  function (error, stdout, stderr) {
    if (error) {
      //handle error
    } else {
      console.log("stdout: " + stdout)
      console.log("stderr: " + stderr)
      //handle success
    }
  }
)

To powinno dać ci wykonywalny plik binarny ffmpeg w twojej funkcji lambda – ale musisz się upewnić, że jest na twojej $PATH.

Porzuciłem fluent-ffmpeg i używałem node do uruchamiania poleceń ffmpeg na rzecz uruchomienia skryptu bash z node, więc dla mnie musiałem dodać /tmp/ do mojej ścieżki na górze funkcji lambda:

process.env.PATH = process.env.PATH + ':/tmp/'

Jeśli używasz fluent-ffmpeg, możesz ustawić ścieżkę do ffmpeg poprzez:

process.env['FFMPEG_PATH'] = '/tmp/ffmpeg';

Nieco pokrewny/bezwstydny sampling: pracuję nad zestawem modułów, aby ułatwić budowanie funkcji Lambda z modułów składowych pod nazwą Lambduh . To może zaoszczędzić trochę czasu. Szybki przykład: obsługa tego scenariusza za pomocą lambduh-execute byłoby tak proste jak:

promises.push(execute({
  shell: "cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg",
})

Gdzie promises jest tablicą obietnic do uruchomienia.

 34
Author: Russ Matney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-05 04:45:47

Stworzyłem repo GitHub , które robi dokładnie to (a także zmienia rozmiar wideo w tym samym czasie). Odpowiedź Russa Matneya była niezwykle pomocna, aby plik FFmpeg był wykonywalny.

 6
Author: BKH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-12 06:42:28

Nie jestem pewien, jakiej biblioteki trybu niestandardowego użyłbyś do zadania ffmpeg; niemniej jednak kroki do wykonania tego są takie same.

  1. Utwórz osobny katalog dla Twojego projektu lambda
  2. Uruchom npm install <package name> wewnątrz tego katalogu (automatycznie wstawiłoby to node_modules i odpowiednie pliki)
  3. Utwórz plik index.js w katalogu projektu lambda, następnie użyj require(<package-name>) i wykonaj główne zadanie tworzenia miniatur wideo
  4. Gdy skończysz, możesz spakować folder projektu lambda i przesłać go I ' m AWS management console i skonfigurować plik indeksu i obsługę.
  5. Pozostałe konfiguracje wykonują ten sam proces, jak rola wykonania IAM, WYZWALACZ, Specyfikacja pamięci i limitu czasu itp.
 2
Author: Naveen Vijay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 03:31:29

Mam to działa bez przenoszenia go do /tmp. Uruchomiłem chmod 755 na moim pliku wykonywalnym i zadziałało! Miałem problemy, gdy wcześniej ustawiłem go na chmod 777.

 2
Author: Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 06:50:51

W momencie pisania, jak dobrze opisałem powyżej, nie ma już potrzeby kopiowania plików binarnych z bieżącego folderu, czyli folderu var/task lub process.env['LAMBDA_TASK_ROOT'] do folderu /tmp. Więc to jest po prostu konieczne, aby zrobić

chmod 755 dist/ff*

Jeśli masz tam swoje ffmpeg i ffprobe binaria.

Przy okazji, wcześniej moje rozwiązanie 2 centów, które zmarnowało 2 dni czasu było to

Configure : function(options, logger) {

        // default options
        this._options = {

          // Temporay files folder for caching and modified/downloaded binaries
          tempDir : '/tmp/',

          /**
           * Copy binaries to temp and fix permissions
           * default to false  - since this is not longer necessary
           * @see http://stackoverflow.com/questions/27708573/aws-lambda-making-video-thumbnails/29001078#29001078
          */
          copyBinaries : false

        };

        // override defaults
        for (var attrname in options) { this._options[attrname] = options[attrname]; }

        this.logger=logger;
        var self=this;

        // add temporary folder and task root folder to PATH
        process.env['PATH'] = process.env['PATH'] + ':/tmp/:' + process.env['LAMBDA_TASK_ROOT']

        if(self._options.copyBinaries)
        {
          var result = {}
          execute(result, {
            shell: "cp ./ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg", // copies an ffmpeg binary to /tmp/ and chmods permissions to run it
            logOutput: true
          })
          .then(function(result) {
            return execute(result, {
               shell: "cp ./ffprobe /tmp/.; chmod 755 /tmp/ffprobe", // copies an ffmpeg binary to /tmp/ and chmods permissions to run it
               logOutput: true
             })
          })
          .then(function(result) {
             self.logger.info("LambdaAPIHelper.Configure done.");
          })
          .fail(function(err) {
            self.logger.error("LambdaAPIHelper.Configure: error %s",err);
          });
        } //copyBinaries

      }

Pomógł dobry lambduh moduł:

// lambuh & dependencies
var Q = require('q');
var execute = require('lambduh-execute');

Jak opisano tutaj i potwierdzone przez autor modułu teraz Można to uznać za niepotrzebne, przy okazji warto dobrze zrozumieć środowisko lambda runtime (maszyna), które jest dobrze opisane w eksploracji Lambda Runtime environment .

 2
Author: loretoparisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 09:40:47

Po prostu przechodziłem przez te same problemy, jak opisano powyżej i skończyło się na przeniesieniu z tą samą koncepcją przenoszenia moich skryptów wymagających wykonania do katalogu /tmp.

var childProcess = require("child_process");
var Q = require('q');

Kod, którego użyłem jest poniżej z obietnicami:

.then(function(result) {
    console.log('Move shell ffmpeg shell script to executable state and location');
    var def = Q.defer();
    childProcess.exec("mkdir /tmp/bin; cp /var/task/bin/ffmpeg /tmp/bin/ffmpeg; chmod 755 /tmp/bin/ffmpeg",
      function (error, stdout, stderr) {
        if (error) {
          console.log("error: " + error)
        } else {
          def.resolve(result);
        }
      }
    )
    return def.promise;
  })
 0
Author: codin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 18:59:10

Aby plik binarny mógł być bezpośrednio wykonywalny na AWS Lambda (bez konieczności kopiowania do / tmp i chmod), musisz upewnić się, że plik binarny ma uprawnienia wykonywalne Kiedy zostanie dodany do pliku ZIP.

Jest to problematyczne w systemie Windows, ponieważ Windows nie rozpoznaje binariów Linuksa. Jeśli używasz systemu Windows 10, użyj powłoki Ubuntu Bash, aby utworzyć pakiet.

Stworzyłem węzeł.szablon funkcji js specjalnie do tego celu tutaj . Pozwala na aby wdrożyć jeden lub więcej binariów do Lambda, następnie wykonaj dowolne polecenie powłoki i przechwyć wyjście.

 0
Author: Hai Phan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-09 09:12:13