如何将支持MP3的SoX二进制文件与AWS的Linux AMI的局限性一起打包到NodeJS AWS Lambda函数中?

我在过去3个月里一直在处理这个问题,而且完全陷入困境。

我正在尝试打包使用SoX的NodeJS AWS Lambda函数,并将其依赖项转换为MP3文件。 我可以通过按照这里引用的指令来获取我的代码来识别SoX二进制文件的自定义位置。 我最终将此代码添加到我的Lambda函数调用的开始,以更新process.env PATHvariables以包括自定义二进制文件的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是包含我编译的sox二进制binaries的目录。

由于我使用的是NodeJS,因此我必须修改sox-audio NPM模块,以便使用更新后的process.envvariables来执行child_process exec和spawn调用。 这允许代码find二进制文件,但在执行过程中仍然出现错误。

 Sox process exited with code 127 and signal null 

我明白,虽然它可以find我包含的SoX二进制文件,但它不能find一个与SoX一起使用的命令,但没有更多的信息,我不知道它是什么。 我想这是因为我不确定是否有包含二进制文件的所有文件。

为了在支持MP3的情况下编写一个完整的SoX编译版本,我创build了一个新的EC2 linux实例,然后按照这里提供的说明进行操作。

我一行一行地确保我可以得到它的工作,并安装了一些依赖项以启用编译(如开发人员工具 ),并通过导出export PATH=$PATH:/usr/local/bin导出构buildPATH能够得到与MP3支持安装的完整版本。 我testing了它,它的工作方式就像我需要它。

由于AWS Lambda函数与AWS EC2实例在Linux(Amazon Linux AMI)的相同精简版上运行,理论上,如果我可以导出SoX构build并将其包含在我的Lambda包中,那么我应该能够使其工作。

那是我遇到麻烦的地方。 什么构成了自己? /usr/local/bin有一个SoX linux可执行文件,它是一个单独的文件,但是其中还有许多文件,这些文件似乎都与使SoX及其依赖项相关。 这里是我正在构build的/usr/local/bin中的文件列表。

/ usr / local / bin中的文件

我尝试通过FTP导出所有这些文件,然后将它们导入到另一个干净的EC2实例中,但即使在运行export PATH=$PATH:/usr/local/bin由于依赖性问题,SoX将无法运行。 很明显,仅仅导出这些文件是不够的。

  • 我如何导出以及导出哪些内容,从而将我的SoX构build与支持MP3的EC2实例关联起来,并将其包含在我的AWS Lambda函数中?
  • 是安装的依赖关系的长列表让MP3工作,使这不可能的?
  • 是否有文件不仅仅是我需要包含的/usr/local/bin目录?

我真的不知道还有什么可以去的呢。 请帮忙 :(

花了我3个月的时间,终于贴出来了,我在同一天搞清楚了。

在做了一些更多的研究之后,我得出结论:我需要创建SoX的静态构建,并具有必要的依赖关系来转换MP3。 我结束了一个脚本来创建一个基于这个博客帖子 , 这个博客文章的静态构建。

我之所以合并了一下,是因为我使用的是Amazons Linux AMI,它非常简单。 所以在第二个博客中提到的所有debian和apt-get的东西都不可能工作。 但是,我需要确保安装了编译器,所以我不会遇到任何错误。 下面是我结束了运行。 我以root身份完成了整个任务,因为EC2 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 

我担心我不得不再次尝试构建它,而不进行yum update或yum安装,因为我最终希望将它放在一个Lambda函数中,但这不是必需的! 当我将其添加到我的测试Lambda函数并上传时,根据云日志,它没有问题。 这意味着在Lambda容器中使用的Amazon Linux AMI已经安装了yum更新和适当的编译器。