尝试使用 ffmpeg 时 AWS Lambda 权限被拒绝

Posted

技术标签:

【中文标题】尝试使用 ffmpeg 时 AWS Lambda 权限被拒绝【英文标题】:AWS Lambda permission denied when trying to use ffmpeg 【发布时间】:2016-07-03 23:16:44 【问题描述】:

我想编写一个响应 S3 put 事件的处理程序,以转换任何上传到 mp4 的 avi 文件。我在 Java、Eclipse 中使用 AWS 工具包插件进行操作。对于视频转换,我使用带有ffmpeg-cli-wrapper 的ffmpeg,并且我在源代码树中提供了ffmpeg 的静态(linux)二进制文件。

我发现当我上传函数时,二进制文件被放入/var/task,但是当我尝试使用我编写的测试函数时,我得到一个“权限被拒绝”的错误。

import net.bramp.ffmpeg.FFmpeg;

public class LambdaFunctionHandler implements RequestHandler<S3Event, String> 

    private static final String FFMPEG = "/var/task/ffmpeg";

    public String handleRequest(S3Event event, Context context) 

        try 
            FFmpeg ff = new FFmpeg(FFMPEG);
            System.out.println(ff.version());
         catch (Exception e) 
            e.printStackTrace();
        

        return "foo";
    

堆栈跟踪的第一行:java.io.IOException: Cannot run program "/var/task/ffmpeg": error=13, Permission denied

如何执行这个二进制文件?我已经按照其他人的建议和chmod 755 在上传之前完成了二进制文件,但没有任何区别。

【问题讨论】:

【参考方案1】:

AWS Lambda 在 Amazon Linux 上运行。这是一个已知问题。尝试构建(启用静态)并检查它是否适用于 Amazon Linux 并上传该二进制文件。您没有chmod/var/task/ 中文件的权限。或者试试这个可行的解决方案:

ffmpeg 移动到/tmp chmod 755 /tmp/ffmpeg 致电/tmp/ffmpeg

请参阅此discussion 了解更多信息。

【讨论】:

如何移动文件?是我可以从命令行执行一次还是需要在方法开始时在代码中执行此操作? 在方法的开始处。如果mv 失败,请尝试cp。它总是对我有用。 很抱歉没有早点回复您。我用ProcessBuilder 照你说的做,一切都很好。感谢您的帮助! 你也可以在 Java 中使用 Files.copy【参考方案2】:

我最近遇到了这个问题,在弄乱了各种手动解决方案之后,真正解决了这个问题的是:

    创建一个 Lambda 层,在 bin/ 文件夹中仅包含 ffmpeg 二进制文件 创建一个 Lambda 函数来实现该层,并在 python 代码中运行/opt/bin/ffmpeg

见https://aws.amazon.com/blogs/media/processing-user-generated-content-using-aws-lambda-and-ffmpeg/

【讨论】:

【参考方案3】:

正如 helloV 所提到的,您可能必须包含一个静态 ffmpeg 二进制文件并将其复制到某个位置并从那里执行。 详细解答,(node.js代码)给here

【讨论】:

以上是关于尝试使用 ffmpeg 时 AWS Lambda 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 上的 FFmpeg 转码导致无法使用(静态)音频

AWS Lambda 制作视频缩略图

AWS Lambda 函数帮助

带有 Lambda 函数的 AWS EBS 与 EFS

尝试访问DynamoDB时,AWS Lambda node.js超时

使用无服务器部署 AWS Lambda 函数在需要外部模块时不会部署