Naveen 概述的过程是正确的,但它掩盖了一个可能非常痛苦的细节 - 包括 zip 中的 ffmpeg 二进制文件并在您的 lambda 函数中访问它。
我刚刚经历了这个,它是这样的:
- 在压缩的 lambda 函数包中包含 ffmpeg 静态二进制文件(我有一个 gulp 任务将其复制到
/dist
每次构建时)
当您的函数被调用时,将二进制文件移动到一个/tmp/
目录并chmod
让您自己访问(2017 年 2 月更新:据报道,这不再需要,回复:@loretoparisi
和@allen
的答案)。
- 更新您的 PATH 以包含 ffmpeg 可执行文件(我使用了fluent-ffmpeg,它可以让您设置两个环境变量来更轻松地处理它。
让我知道是否需要更多详细信息,我可以更新此答案。
复制和 chmod(第 2 步)显然不理想......很想知道是否有人找到了更好的方法来处理这个问题,或者这是否是这种架构风格的典型。
(第二次更新,在第一次更新 b/c 之前写它更相关):
正如@Allen 指出的那样,复制+ chmod 步骤不再是必要的——我在Lambda 函数中直接从/var/task/ 执行ffmpeg,此时没有任何问题。在将它们上传到 Lambda 之前,请确保使用chmod 755
任何二进制文件(也正如@Allen 指出的那样)。
我不再使用 fluent-ffmpeg 来完成这项工作。相反,我正在更新 PATH 以包含process.env['LAMBDA_TASK_ROOT']
并执行简单的 bash 脚本。
在 Lambda 函数的顶部:
process.env['PATH'] = process.env['PATH'] + "/" + process.env['LAMBDA_TASK_ROOT']
对于使用 ffmpeg 的示例:lambda-pngs-to-mp4。
对于大量有用的 lambda 组件:lambduh。
以下更新留给后代,但不再需要:
更新更多细节:
我在这里下载了静态 ffmpeg 二进制文件。Amazon 建议启动 EC2 并在其中构建一个二进制文件供您使用,因为该环境将与 Lambda 运行的条件相同。可能是一个好主意,但更多的工作,这个静态下载对我有用。
我只将二进制文件提取ffmpeg
到我的项目的待归档/dist
文件夹中。
当您将 zip 上传到 lambda 时,它位于/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
}
}
)
这应该在你的 lambda 函数中为你提供一个可执行的 ffmpeg 二进制文件——但你仍然需要确保它在你的 $PATH 上。
我放弃了 fluent-ffmpeg 并使用 node 来启动 ffmpeg 命令,转而只在 node 之外启动一个 bash 脚本,所以对我来说,我必须/tmp/
在 lambda 函数的顶部添加我的路径:
process.env.PATH = process.env.PATH + ':/tmp/'
如果您使用 fluent-ffmpeg,您可以通过以下方式设置 ffmpeg 的路径:
process.env['FFMPEG_PATH'] = '/tmp/ffmpeg';
有点相关/无耻的自插拔:我正在开发一组模块,以简化以Lambduh为名的可组合模块构建 Lambda 函数。将这些东西放在一起可能会节省一些时间。一个简单的例子:使用lambduh-execute处理这种情况很简单:
promises.push(execute({
shell: "cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg",
})
在哪里promises
运行一系列承诺。