AWS Lambda使用ffmpeg时权限被拒绝

9
我想编写一个处理程序,以响应S3上传事件,并将上传的任何avi文件转换为mp4格式。我正在使用AWS工具包插件在Eclipse中使用Java进行操作。对于视频转换,我使用ffmpeg-cli-wrapper的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了这个二进制文件,但是没有任何改变。

3个回答

11

AWS Lambda运行在Amazon Linux上,这是一个已知的问题。尝试构建(启用静态),并检查它是否在Amazon Linux上正常工作,并上传该二进制文件。您没有特权chmod /var/task/目录中的文件。或者尝试这种有效的解决方法:

  • ffmpeg移动到/tmp
  • chmod 755 /tmp/ffmpeg
  • 调用/tmp/ffmpeg

有关更多信息,请参见此讨论


我该如何移动文件?这是我可以在命令行中一次性完成的操作吗?还是我需要在方法开始时在代码中执行此操作? - moarCoffee
在方法开始时,如果 mv 失败了,请尝试使用 cp。这对我总是有效的。 - helloV
抱歉之前没有及时回复你。我按照你说的使用了ProcessBuilder,一切都很好地运行了。感谢你的帮助! - moarCoffee
1
你可以在Java中使用Files.copy。 - voho

1

0

正如helloV所提到的,您可能需要包含一个静态的ffmpeg二进制文件,并将其复制到某个位置并从那里执行。 这里提供了一个详细的答案(node.js代码)在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接