ffmpeg를 통한 영상 convert 과정 serverless 적용 시도

appti·2022년 5월 15일
2

ffmpeg를 통한 영상 convert 과정 serverless 적용 시도

기존

기존의 영상 convert 과정은 다음과 같습니다.

사용자가 영상 업로드 ->
로컬(ec2)에 영상 저장 ->
ffmpeg를 통해 hls 형식으로 변환 후 로컬(ec2)에 저장 ->
변환된 모든 파일(.m3u8, ts)을 s3에 업로드 ->
원본 영상 삭제 -> 
hls 형식으로 변환한 영상 삭제 

위 과정 중 convert 과정 시 걸리는 시간이 길다 보니, 사용자가 영상을 업로드한 이후 변환 작업을 aws lambda에 위임하면 긍정적인 결과를 기대할 수 있을 것이라고 생각했습니다.

aws lambda

aws lambdaaws에서 제공하는 서버리스 컴퓨팅 서비스 입니다.
서버리스 컴퓨팅은 애플리케이션을 실행하기 위한 별도의 서버 설정 없이 곧바로 코드를 실행해주는 서비스를 의미합니다.
즉 서버가 없는 웹 애플리케이션이라고 볼 수 있습니다.

layer

aws lambdalayer에는 임시 파일을 저장할 수 있는 /tmp 디렉토리를 제공합니다.

업로드 시 파일 용량 제한을 200MB으로 설정했기 때문에 원본 영상 + hls 영상을 모두 /tmp에 저장할만하다고 판단했습니다.
또한, 새롭게 실행될 때 마다 삭제되기 때문에 기존 로컬에서 작업하던 때와 비교하면 원본 영상 + hls 형식의 영상을 삭제해야 하는 과정을 생략할 수 있습니다.

aws lambda 설정

aws lambda에서 s3로 업로드를 할 것이기 때문에 위와 같이 새로운 정책을 생성했습니다.

aws lambda layer에 업로드 할 ffmpegs3에 미리 업로드 했습니다.
이 경우 ffmpeg로 업로드 했기 때문에 /opt/ffmpeg/로 접근 가능합니다.

이후 aws lambdalayer를 생성해 등록해주었습니다.
실행 시간의 경우 5분으로 설정했습니다.

aws api gateway 사용

aws lambda + aws api gateway를 통해 기대했던 동작은 다음과 같습니다.

사용자가 영상 업로드 ->
애플리케이션 내부적으로 aws api gateway 호출 ->
aws api gateway에서 aws lambda 실행 ->
aws lambda layer에 영상 저장 ->
aws lambda에서 ffmpeg를 통해 hls 형식으로 변환 후 aws lambda layer에 저장->
변환된 모든 파일(.m3u8, ts)을 s3에 업로드 ->
aws api gateway가 애플리케이션으로 응답 ->
애플리케이션이 사용자에게 aws api gateway의 응답을 전달

그러나 실행 이후 cloudwatch로 확인해보면, 도중에 실행이 중지되는 결과를 확인할 수 있었습니다.
아무런 오류도 발생하지 않았고, aws lambda의 실행 시간이 끝나지도 않았기 때문에 문제점을 파악하는데 시간이 좀 걸렸지만 원인은 기본적인 부분이였습니다.

aws api gateway의 기본 제한 시간은 최대 29000 밀리초였기 때문이였습니다.
그 이상 걸릴 시 비동기로 처리하면 되지만, 비동기로 처리할 것이라면 굳이 aws api gateway를 사용해야하나 싶어 다른 방법을 시도했습니다.

s3 트리거 사용

s3에 영상이 업로드되면 이를 트리거로 설정해 aws lambda를 호출해 영상 convert 과정을 처리하는 방법입니다.

영상 convert의 결과에 대해서는 푸쉬 알람 등으로 처리할 예정이였습니다.

이 경우 기대했던 동작은 다음과 같습니다.

사용자가 영상 업로드 ->
애플리케이션에서 영상을 s3에 업로드 ->
트리거로 인해 aws lambda 실행 ->
aws lambda에서 s3에 업로드된 영상을 읽어와 ffmpeg를 통해 hls 형식으로 변환 후 aws lambda layer에 저장 ->
변환된 모든 파일(.m3u8, ts)을 s3에 업로드 ->
s3에 저장된 원본 파일 삭제 ->
푸쉬 알람으로 사용자에게 convert 과정이 완료되었음을 알림

이렇게 된다면 사용자는 영상을 업로드한 뒤, 웹 애플리케이션의 서비스를 이용하다가 푸쉬 알림을 통해 영상이 업로드되었음을 확인하는 식으로 쾌적한 서비스 이용이 가능하리라 생각했습니다.

실행 결과 정상적으로 hls 형식으로 저장되었음을 확인할 수 있었습니다.

메타데이터 또한 올바르게 설정되었음을 확인할 수 있었습니다.

문제점

영상 convert 테스트 시 사용한 영상의 용량은 10.1MB로, 매우 짧은 영상이였습니다.
그런데 cloudwatch를 통해 확인해본 소모 시간은 448534ms, 5분이 넘어가는 시간이였습니다.

이후 aws api gateway를 비동기로 호출하는 식으로 변경해봤으나 큰 의미가 없을 정도로 시간이 오래 걸렸습니다.

이렇게 되면 사용자 입장에서는 영상 업로드 시 큰 불편함을 느낄 것이라 생각했습니다.

결론

결론적으로는 영상 convert 과정에서 aws lambda를 이용한 serverless 적용은 포기했습니다.

영상 convert 과정은 서비스 오픈 시점에서 사용자 수가 적을 것이라 판단했기 때문에 일단은 기존 방식대로 ec2에서 영상 convert 작업을 수행하고, 사용자 수가 증가하게 된다면 별도의 인스턴스를 생성해 영상 convert 전용 서버를 구축하기로 결정했습니다.

기타

ffmpeg를 통해 hls 형식으로 영상을 convert하는 과정은 리소스가 많이 소모되기 때문에 간단한 serverless 웹 애플리케이션aws lambda로는 실용성이 없지만, ffmpeg를 통해 영상의 특정 시간을 지정해 썸네일 사진을 추출하는 등 비교적 간단한 작업에는 충분히 활용할 수 있을 것 같습니다.

profile
안녕하세요

5개의 댓글

comment-user-thumbnail
2022년 8월 3일

안녕하세요, 저도 비슷한 작업을 앞두고 있는데요.
유저가 올린 영상이 S3에 올라가고 트리거로 람다 함수가 동작합니다.
람다 함수에서 ffmpeg을 통해 특정 형태로 crop을 하고 다른 영상과 합성 작업을 거친 후
hls의 컨버팅은 다른 서비스를 이용하는데요.

궁금한 부분이, ffmpeg을 람다 함수에서 활용하려면 aws에 올려야 한다고 본 듯한데
어떻게 업로드하면 되는지 궁금합니다.

그리고 유저가 영상을 올릴 때 영상 외에 특정 정보도 함께 받아야 하거든요.
그 정보를 토대로 인코딩을 할 수가 있는데,
s3 트리거 상태에서는 해당 정보를 받을 수가 없는데
api gateway 방식으로 처리해야 되는 걸까요?

좋은 방법이 있다면 조언 부탁드립니다.

1개의 답글
comment-user-thumbnail
2022년 10월 20일

안녕하세요.
비슷한 요구사항이 있어서 자동화 구성중인데요,
아무래도 Lambda의 경우 실행시간 제한등도 있기떄문에( 30분 ) 용량이 큰 동영상의 경우 문제가 생길수 있습니다.

이런경우 AWS Batch 를 이용하여 구성을 하면 Lambda를 이용해서 구성했을때와 비슷한 워크플로우로 시간제약 없이 필요할때만 EC2에서 동영상 변환을 구성할수 있을것 같습니다.

포스트가 5월에 작성이 된것이라 이미 어떤식으로든 처리를 하셨겠지만 나중에 검색해 보시는 분들을 위해 댓글 남깁니다. :)

1개의 답글