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

AWS Lambda permission denied when trying to use ffmpeg

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

我发现当我上传函数时,二进制文件被放入 /var/task,但是当我尝试使用我编写的测试函数时,出现 "permission denied" 错误。

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 二进制文件,然后再上传,但没有什么不同。

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

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

查看此 discussion 了解更多信息。

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

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

  1. 创建一个 Lambda 层,在 bin/ 文件夹中只有 ffmpeg 二进制文件
  2. 创建一个 Lambda 函数来实现所述层,并在 python 代码中 运行 /opt/bin/ffmpeg

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