moarCoffee
moarCoffee

Reputation: 1319

AWS Lambda permission denied when trying to use ffmpeg

I want to write a handler that responds to S3 put events to convert any avi files that are uploaded to mp4. I doing it in Java, in Eclipse, with the AWS toolkit plugin. For video conversion, I am using ffmpeg with ffmpeg-cli-wrapper, and I have provided a static (linux) binary of ffmpeg in the source tree.

I have found that when I upload the function, the binary gets put in /var/task, but when I try to use the test function I've written, I get a "permission denied" error.

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";
    }
}

And the first line of the stacktrace: java.io.IOException: Cannot run program "/var/task/ffmpeg": error=13, Permission denied.

How do I execute this binary? I have done as others have suggested and chmod 755 the binary before uploading, but it hasn't made a difference.

Upvotes: 9

Views: 14260

Answers (3)

Nick Charney Kaye
Nick Charney Kaye

Reputation: 4441

I ran into this issue recently, and after messing with various manual solutions, what really solved the issue was:

  1. Create a Lambda Layer, with only the ffmpeg binary inside a bin/ folder
  2. Create a Lambda Function to implement said layer, and in the python code run /opt/bin/ffmpeg

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

Upvotes: 2

Chenna V
Chenna V

Reputation: 10523

As helloV mentioned, you might have to include a static ffmpeg binary and copy it to a location and execute from there. A detailed answer, (node.js code) is given here

Upvotes: 0

helloV
helloV

Reputation: 52443

AWS Lambda runs on Amazon Linux. It is a known issue. Try building (with static enabled) and check if it works on Amazon Linux and upload that binary. You do not have the privileges to chmod the files in /var/task/. Or try this solution that works:

  • Move ffmpeg to /tmp
  • chmod 755 /tmp/ffmpeg
  • Call /tmp/ffmpeg

See this discussion for more info.

Upvotes: 11

Related Questions