Подтвердить что ты не робот

AWS Lambda делает видео эскизы

Я хочу сделать миниатюры из видео, загруженных на S3, я знаю, как сделать это с помощью Node.js и ffmpeg.

Согласно этот пост форума Я могу добавить библиотеки:

ImageMagick - единственная внешняя библиотека, которая в настоящее время предоставляется по умолчанию, но вы можете включить любые дополнительные зависимости в zip файл, который вы предоставляете при создании функции Lambda. Обратите внимание, что если это является собственной библиотекой или исполняемым файлом, вам необходимо убедиться, что она работает на Amazon Linux.

Но как я могу поместить статический бинарный файл ffmpeg на aws lambda?

И как я могу вызвать из Node.js этот статический двоичный файл (ffmpeg) с AWS Lambda?

Я новичок с amazon AWS и Linux

Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

Процесс, описанный Naveen, верен, но он замаскирует деталь, которая может быть довольно болезненной - включая двоичный файл ffmpeg в zip и доступ к нему в вашей лямбда-функции.

Я только что прошел через это, это было так:

  • Включите статический двоичный файл ffmpeg в вашем zipped-пакете функций лямбда (у меня есть задача gulp, чтобы копировать ее в /dist каждый раз, когда она создается)
  • Когда вы вызываете свою функцию, переместите двоичный файл в директорию /tmp/ и chmod, чтобы предоставить вам доступ (Update Feb 2017: он сообщил, что это больше не нужно, re: @loretoparisi и @allen).
  • обновите свой PATH, чтобы включить исполняемый файл ffmpeg (я использовал fluent-ffmpeg, который позволяет вам установить два env vars, чтобы справиться с этим легче.

Сообщите мне, если требуется более подробная информация, я могу обновить этот ответ.

Копия и chmod (шаг 2), очевидно, не идеальны.... хотелось бы знать, найдет ли кто-нибудь лучший способ справиться с этим, или если это типично для этого стиля архитектуры.

(2nd Update, записывая его перед первым обновлением b/c более актуальным):

Шаг copy + chmod больше не нужен, как отметил @Allen - я выполняю ffmpeg в функциях лямбда прямо из/var/task/без проблем на данный момент. Обязательно chmod 755 любые бинарные файлы перед их загрузкой в ​​Lambda (также, как указал @Allen).

Я больше не использую fluent-ffmpeg для выполнения этой работы. Скорее, я обновляю PATH, чтобы включить process.env['LAMBDA_TASK_ROOT'] и выполнить простые скрипты bash.

В верхней части вашей лямбда-функции:

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

В примере, который использует ffmpeg: lambda-pngs-to-mp4.

Для множества полезных лямбда-компонентов: lambduh.

Ниже приведенное обновление осталось для потомков, но больше не нужно:

ОБНОВЛЕНИЕ С БОЛЬШОЙ ДЕТАЛИ:

Я загрузил статический ffmpeg двоичный здесь. Amazon рекомендует загружать EC2 и создавать двоичные файлы для вашего использования там, потому что эта среда будет такой же, как условия Lambda. Вероятно, хорошая идея, но больше работы, и эта статическая загрузка работала для меня.

Я вытащил только двоичный файл ffmpeg в мою проектную архивацию /dist.

Когда вы загружаете zip в лямбда, он живет в /var/task/. По какой-то причине я столкнулся с проблемами доступа, пытаясь использовать двоичный файл в этом месте, и больше проблем, пытающихся редактировать разрешения на файл там. Быстрая работа - это переместить двоичные файлы на /tmp/ и chmod на него.

В Node вы можете запустить оболочку через child_process. Я сделал так:

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
    }
  }
)

Это многое должно дать вам исполняемый двоичный файл ffmpeg в вашей лямбда-функции, но вам все равно нужно убедиться, что он находится на вашем $PATH.

Я отказался от fluent-ffmpeg и использовал node для запуска команд ffmpeg в пользу запуска только bash script из Node, поэтому для меня мне пришлось добавить /tmp/ к моему пути в верхняя часть лямбда-функции:

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

Если вы используете fluent-ffmpeg, вы можете установить путь к ffmpeg с помощью:

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

Немного связанный/бесстыдный самозапуск: я работаю над набором модулей, чтобы упростить создание функций Lambda из композиционных модулей под именем Lambduh. Мог бы сэкономить время, собирая эти вещи. Быстрый пример: обработка этого сценария с помощью lambduh-execute будет такой же простой, как:

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

Где promises - массив promises, который должен быть запущен.

Ответ 2

Я создал GitHub repo, который делает именно это (а также одновременно изменяет размер видео). Ответ Russ Matney был чрезвычайно полезен для создания исполняемого файла FFmpeg.

Ответ 3

Я не уверен, какую библиотеку пользовательского режима вы будете использовать для задачи ffmpeg; тем не менее, шаги для достижения этой цели одинаковы.

  • Создайте отдельный каталог для вашего проекта лямбда
  • Запустите npm install <package name> внутри этого каталога (это автоматически установит node_modules и соответствующие файлы)
  • Создайте файл index.js в каталоге проекта lambda, затем используйте require(<package-name>) и выполните основную задачу для создания миниатюр видео.
  • Как только вы закончите, вы можете заархивировать папку проекта lambda и загрузить ее. Я - консоль управления AWS, и настрою файл индекса и обработчик.
  • Остальные конфигурации следуют тем же процессам, что и IAM Execution Role, Trigger, Memory и Timeout и т.д.

Ответ 4

Я получил эту работу, не переведя ее на /tmp. Я выполнил chmod 755 в своем исполняемом файле, а потом он сработает! У меня были проблемы, когда я ранее устанавливал его на chmod 777.

Ответ 5

В то время, когда я пишу, как описано выше, больше нет необходимости копировать двоичные файлы из текущей папки, то есть папку var/task или process.env['LAMBDA_TASK_ROOT'] в папку /tmp. Поэтому просто нужно сделать

chmod 755 dist/ff*

если у вас есть ваши двоичные файлы ffmpeg и ffprobe.

Кстати, ранее мое решение за 2 цента, потраченное впустую на 2 дня, было

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

      }

помогает хороший модуль lambduh:

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

Как описано здесь и подтверждено автором модуля, теперь это можно считать не нужным, кстати, это интересно иметь хорошее понимание lambda runtime (машинная) среда, которая хорошо описана в разделе Lambda Runtime environment.

Ответ 6

Я только что рассмотрел те же проблемы, что и описанные выше, и перешел с той же концепцией, что и мои сценарии, требующие выполнения, в каталог /tmp.

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

Код, который я использовал ниже, с promises:

.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;
  })

Ответ 7

Для того, чтобы бинарный файл был непосредственно исполняемым на AWS Lambda (без необходимости копирования в /tmp и chmod), вам необходимо убедиться, что бинарный файл имеет разрешение на выполнение , когда оно добавлено в файл ZIP.

Это проблема в Windows, потому что Windows не распознает двоичные файлы Linux. Если вы используете Windows 10, используйте оболочку Ubuntu Bash для создания пакета.

Я создал специально для этой цели шаблон функции Node.js здесь. Он позволяет развернуть один или несколько двоичных файлов в Lambda, затем выполнить произвольную команду оболочки и захватить вывод.