尝试使用 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
我最近运行遇到了这个问题,在弄乱了各种手动解决方案之后,真正解决了这个问题的是:
- 创建一个 Lambda 层,在
bin/
文件夹中只有 ffmpeg
二进制文件
- 创建一个 Lambda 函数来实现所述层,并在 python 代码中 运行
/opt/bin/ffmpeg
见https://aws.amazon.com/blogs/media/processing-user-generated-content-using-aws-lambda-and-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
我最近运行遇到了这个问题,在弄乱了各种手动解决方案之后,真正解决了这个问题的是:
- 创建一个 Lambda 层,在
bin/
文件夹中只有ffmpeg
二进制文件 - 创建一个 Lambda 函数来实现所述层,并在 python 代码中 运行
/opt/bin/ffmpeg
见https://aws.amazon.com/blogs/media/processing-user-generated-content-using-aws-lambda-and-ffmpeg/