如何在AWS Linux AMI的限制下为NodeJS AWS Lambda Function打包具有MP3支持的SoX二进制文件?

qojgxg4l  于 2023-03-22  发布在  Linux
关注(0)|答案(2)|浏览(128)

我已经在这个问题上工作了3个月,完全卡住了。
我正在尝试打包我的NodeJS AWS Lambda函数,该函数将使用SoX及其依赖项将音频文件转换为MP3。我可以让我的代码通过以下引用here的说明来识别SoX二进制文件的自定义位置,和here。我最终将此代码添加到我的Lambda函数调用的开始以更新进程。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是包含我编译的sox二进制文件的目录。
由于我使用的是NodeJS,我不得不修改sox-audio NPM模块,以便它使用更新的process.env变量来执行child_process exec和spawn调用。这允许代码找到二进制文件,但我仍然在执行过程中收到错误。

Sox process exited with code 127 and signal null

我知道,虽然它可以找到我包含的SoX二进制文件,但它无法找到与SoX一起使用的命令,但没有更多信息,我无法告诉它是什么。我想这是因为我不确定是否包含了所有用于二进制文件的文件。
为了创建一个支持MP3的SoX的干净编译版本,我创建了一个新的EC2 Linux示例,然后按照here提供的说明进行操作。
我一行一行地检查,以确保我可以让它工作,在安装了一些依赖项以启用编译(如developer tools)之后,通过使用export PATH=$PATH:/usr/local/bin导出构建路径,我能够获得安装了MP3支持的完整构建。我测试了它,它完全符合我的需要。
由于AWS Lambda Functions运行在与AWS EC2示例相同的精简版Linux(Amazon Linux AMI)上,因此理论上,如果我可以导出SoX构建并将其包含在我的Lambda包中,那么我应该能够让它工作。
这就是我遇到麻烦的地方。构建本身是由什么组成的?在/usr/local/bin中有一个SoX Linux可执行文件,它是一个单独的文件,但那里也有很多文件,似乎都与使SoX及其依赖项工作有关。下面是我拥有的工作构建中/usr/local/bin中的文件列表。

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

  • 如何导出以及要导出什么,才能将我的SoX工作构建(带有MP3支持)从EC2示例中移除,并将其包含在我的AWS Lambda Function中?
  • 为了让MP3工作而安装的一长串依赖项会使这成为不可能吗?
  • 除了/usr/local/bin目录外,是否还有其他需要包含的文件?

我真的不知道还有什么地方可以去。请帮助:(

mwkjh3gx

mwkjh3gx1#

我花了3个月的时间才终于发帖,我在同一天就想明白了。
在做了更多的研究之后,我得出了这样的结论:我需要创建一个带有必要依赖项的SoX静态版本来转换MP3。我最终整理了一个脚本,以创建一个基于this blog postthis blog post的静态版本。
我把两者结合起来的原因是因为我使用的是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更新或yum安装的情况下再次尝试构建它,因为我最终想把它放在Lambda函数中,但这是没有必要的!当我将它添加到我的测试Lambda函数并上传时,根据云日志,它工作正常,没有问题。这意味着Lambda容器中使用的Amazon Linux AMI已经安装了yum更新和适当的编译器。

mtb9vblg

mtb9vblg2#

在花了几天时间解决这个问题之后,我终于找到了最快的方法来解决这个问题。有一个名为lambda-audio的npm包,但目前,它无法与Amazon Linux AMI 2一起工作,因为它缺少一个依赖项libgomp.so.1
安装lambda-audio后,转到https://github.com/jsonmaur/lambda-audio,这是原始项目的一个分支,并从lib 64文件夹下载libgomp文件。在节点模块下的lambda-audio包中手动创建lib 64文件夹,并复制下载的libgomp文件。
然后,执行以下操作之一:
在Lambda函数的顶部附近添加这一行:

process.env['LD_LIBRARY_PATH'] = process.env['LD_LIBRARY_PATH'] + ':' + '/var/task/node_modules/lambda-audio/lib64'

或者将其添加到lambda的env vars中。

LD_LIBRARY_PATH: /var/task/node_modules/lambda-audio/lib64:$LD_PRIMARY_PATH

希望这能帮保存点麻烦。

相关问题