我已经在这个问题上工作了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
目录外,是否还有其他需要包含的文件?
我真的不知道还有什么地方可以去。请帮助:(
2条答案
按热度按时间mwkjh3gx1#
我花了3个月的时间才终于发帖,我在同一天就想明白了。
在做了更多的研究之后,我得出了这样的结论:我需要创建一个带有必要依赖项的SoX静态版本来转换MP3。我最终整理了一个脚本,以创建一个基于this blog post和this blog post的静态版本。
我把两者结合起来的原因是因为我使用的是Amazons Linux AMI,这是非常准的。所以第二篇博客中提到的所有debian和apt-get的东西都不太可能工作。但是,我需要确保我安装了编译器,这样我就不会遇到任何错误。下面是我最终运行的。我以root身份完成了整个事情,因为特权在EC2 Amazon Linux AMI示例上受到相当的限制。唯一需要作为普通用户运行的是最后的PATH导出。
在此之后,我运行了以下作为我的普通用户
然后我可以运行sox!只需在终端中输入
sox
就可以在终端窗口中调出sox命令列表。更棒的是,我可以下载单个sox linux可执行文件,然后将其上传到一个全新的EC2示例。要让它工作,我只需要在新示例上运行以下内容:
我担心我将不得不在不进行yum更新或yum安装的情况下再次尝试构建它,因为我最终想把它放在Lambda函数中,但这是没有必要的!当我将它添加到我的测试Lambda函数并上传时,根据云日志,它工作正常,没有问题。这意味着Lambda容器中使用的Amazon Linux AMI已经安装了yum更新和适当的编译器。
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函数的顶部附近添加这一行:
或者将其添加到lambda的env vars中。
希望这能帮保存点麻烦。