2016-07-16 4 views
1

Я работаю над этой проблемой в течение последних 3 месяцев и полностью застрял.Как упаковать SoX-бинарник с поддержкой MP3 для функции NodeJS AWS Lambda с ограничениями AMI AWS?

Я пытаюсь упаковать свою функцию NodeJS AWS Lambda, которая будет использовать SoX и ее зависимости для преобразования аудиофайлов в MP3. Я могу получить свой код для распознавания пользовательского местоположения двоичного файла SoX, следуя инструкциям here и here. Я закончил тем, что добавил этот код в начало моего вызова функции Lambda, чтобы обновить переменную process.env PATH, чтобы включить путь к пользовательскому двоичному файлу.

process.env['PATH'] = process.env['PATH'] + ':' 
+ path.join(process.env['LAMBDA_TASK_ROOT'], 'binaries'); 

Это приводит к моему process.env PATH обновление, чтобы выглядеть следующим образом:

/usr/local/lib64/node-v4.3.x/bin:/usr/local/bin:/usr/bin/:/bin:/var/task/binaries 

Что выглядит правильно, binaries каталог, который содержит Сокс Бинарный скомпилированный.

Поскольку я использую NodeJS, я должен был изменить НПМ модуль sox-audio поэтому использовал обновленную переменную process.env для child_process exec и spawn вызовов. Это позволяет коду находить двоичный файл, но я все равно получаю сообщение об ошибке во время выполнения.

Sox process exited with code 127 and signal null 

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

В попытке сделать чистую скомпилированную сборку SoX с поддержкой MP3 я создал новый экземпляр Linux EC2, а затем выполнил приведенные инструкции here.

Я пошел по очереди, чтобы убедиться, что я смогу заставить его работать, и после установки нескольких зависимостей, чтобы включить компиляцию (например, developer tools), и экспортируя сборку PATH с помощью export PATH=$PATH:/usr/local/bin, я смог получить полную сборку, установленную с помощью Поддержка MP3. Я тестировал его, и он работает точно так же, как мне это нужно.

Поскольку функции AWS Lambda функционируют на одной и той же урезанной версии Linux (Amazon Linux AMI) как экземпляры AWS EC2, теоретически, если я смогу экспортировать сборку SoX и включить ее в свой пакет Lambda, тогда я должен иметь возможность заставить его работать.

Вот где у меня проблемы. Что составляет само построение? Существует исполняемый файл SoX linux в /usr/local/bin, который является одним файлом, но там также есть еще больше файлов, которые, похоже, все связаны с созданием SoX и его зависимостей. Вот список файлов в /usr/local/bin на рабочей сборке, которую у меня есть.

files within /usr/local/bin

Я пытался экспортировать все эти файлы через FTP, а затем импортировать их в другой экземпляр EC2 чистой, но даже после того, как работает export PATH=$PATH:/usr/local/bin Сокс бы не работать из-за вопроса зависимости. Понятно, что просто экспортировать эти файлы недостаточно.

  • Как экспортировать и что мне экспортировать, чтобы взять мою рабочую сборку SoX с поддержкой MP3 из экземпляра EC2 и включить ее в работу в моей функции AWS Lambda?
  • Является ли длинный список установленных зависимостей, чтобы заставить MP3 работать, чтобы сделать это невозможным?
  • Есть ли файлы более чем в /usr/local/bin каталоге, которые мне нужно включить?

Я действительно не знаю, где еще пойти с этим. Пожалуйста, помогите :(

ответ

5

У меня ушло 3 месяца, чтобы наконец-то опубликовать, и я полагаю, это тот же самый день.

После этого еще несколько исследований я пришел к выводу, что мне нужно создать статическую сборку SoX с необходимые зависимости для преобразования MP3. в конце концов я собираю сценарий для создания статической сборки на основе this blog post и this blog post.

причины, я объединил немного от обоего, потому что я использовал амазонка Linux AMI, который очень barebones.Таким образом, все debian и apt-get, упомянутые во втором блоге, вряд ли сработают. Однако мне нужно было убедиться, что у меня установлен complier, поэтому я не запускал в любые ошибки. Ниже я закончил работать. Я сделал все это как root, так как привилегии довольно ограничены экземплярами AMI Amazon Linux AMI. Единственное, что нужно запустить, как обычный пользователь, - это экспорт PATH в самом конце.

sudo yum update 
sudo yum install gcc44 gcc-c++ libgcc44 cmake –y 

# now grab sox and its dependencies 
mkdir -p deps 
mkdir -p deps/unpacked 
mkdir -p deps/built 
mkdir -p deps/built/libmad 
mkdir -p deps/built/sox 
mkdir -p deps/built/lame 
wget -O deps/sox-14.4.1.tar.bz2 "http://downloads.sourceforge.net/project/sox/sox/14.4.1/sox-14.4.1.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fsox%2Ffiles%2Fsox%2F14.4.1%2F&ts=1416316415&use_mirror=heanet" 
wget -O deps/libmad-0.15.1b.tar.gz "http://downloads.sourceforge.net/project/mad/libmad/0.15.1b/libmad-0.15.1b.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmad%2Ffiles%2Flibmad%2F0.15.1b%2F&ts=1416316482&use_mirror=heanet" 
wget -O deps/lame-3.99.5.tar.gz "http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flame%2Ffiles%2Flame%2F3.99%2F&ts=1416316457&use_mirror=kent" 

# unpack the dependencies 
pushd deps/unpacked 
tar xvfpj ../sox-14.4.1.tar.bz2 
tar xvfpz ../libmad-0.15.1b.tar.gz 
tar xvfpz ../lame-3.99.5.tar.gz 
popd 

# build libmad, statically 
pushd deps/unpacked/libmad-0.15.1b 
./configure --disable-shared --enable-static --prefix=$(realpath ../../built/libmad) 
# Patch makefile to remove -fforce-mem 
sed s/-fforce-mem//g <Makefile> Makefile.patched 
cp Makefile.patched Makefile 
make 
make install 
popd 

# build lame, statically 
pushd deps/unpacked/lame-3.99.5 
./configure --disable-shared --enable-static --prefix=$(realpath ../../built/lame) 
make 
make install 
popd 

# build sox, statically 
pushd deps/unpacked/sox-14.4.1 
./configure --disable-shared --enable-static --prefix=$(realpath ../../built/sox) \ 
    LDFLAGS="-L$(realpath ../../built/libmad/lib) -L$(realpath ../../built/lame/lib)" \ 
    CPPFLAGS="-I$(realpath ../../built/libmad/include) -I$(realpath ../../built/lame/include)" \ 
    --with-mad --with-lame --without-oggvorbis --without-oss --without-sndfile --without-flac --without-gomp 
make -s 
make install 
popd 

cp deps/built/sox/bin/sox . 
rm -rf deps/built 
rm -rf deps/unpacked 

После этого я побежал следующий как мой обычный пользователь

export PATH=$PATH:/home/ec2-user 

я мог бы запустить SOX! Просто введите sox в терминал, чтобы вывести sox список команд в окне терминала.

Еще лучше, я смог затем загрузить один исполняемый файл sox linux, а затем загрузить его в новый экземпляр EC2. Единственные, что я должен был работать на новом экземпляре, чтобы получить его на работу была следующее:

sudo yum update 
sudo yum install gcc44 gcc-c++ libgcc44 cmake –y 
export PATH=$PATH:/home/ec2-user 

Я был обеспокоен тем, что я должен был бы попытаться построить его снова, не делая обновления ня или ни устанавливающие, так В конечном итоге я хочу включить это в функцию лямбда, но это не было необходимо! Когда я добавил его в свою тестовую функцию Lambda и загрузил ее, она работала без проблем в соответствии с облачными журналами. Это должно означать, что AMI Amazon Linux, используемый в контейнерах Lambda, уже содержит обновления yum и соответствующие компиляторы.

 Смежные вопросы

  • Нет связанных вопросов^_^