[AWS] MediaConvert + lambda를 이용한 Vod 스트리밍 파일 업로드

AWS MediaConvert를 활용하여 비디오 파일을 변환하고 스트리밍 서비스에 최적화된 형태로 처리하는 방법을 실습해본다. 

아키텍처

  1. 사용자가 S3 버킷(Input Videos)에 원본 비디오 파일을 업로드한다.
  2. 이 업로드 이벤트가 Lambda 함수를 트리거한다.
  3. Lambda 함수는 AWS MediaConvert 작업을 자동으로 시작한다.
  4. MediaConvert는 업로드된 비디오를 트랜스코딩하여, 다양한 포맷(HLS, MP4 등)과 썸네일 이미지 등으로 변환한다.
  5. 변환된 결과물은 S3 버킷(Output Media Files)에 저장된다. 
  6. 이 출력 파일들은 사용자가 스트리밍하거나 다운로드할 수 있는 형태(HLS, MP4, 썸네일 이미지 등)로 제공된다. 

AWS Media Convert

AWS MediaConvert는 AWS에서 제공하는 비디오 트랜스코딩 서비스로, 다양한 형식의 비디오 파일을 사용자가 원하는 출력 형식으로 변환할 수 있도록 지원한다. 이를 통해 고품질의 비디오 콘텐츠를 다양한 디바이스 및 네트워크 환경에서 원활하게 스트리밍할 수 있게 해준다.

MediaConvert는 AWS Lambda 및 S3와의 연동을 통해 자동화된 영상 처리 워크플로우를 구성한다. 예를 들어, S3에 비디오 파일이 업로드되면 Lambda 함수가 트리거되어 MediaConvert 작업을 자동으로 시작하고, 결과 파일을 지정된 버킷에 저장하는 방식으로 전체 프로세스를 무중단으로 처리할 수 있다.

또한, 다양한 코덱(H.264, H.265 등), 해상도(480p, 720p, 1080p 등), 출력 형식(MP4, HLS, DASH 등)을 지원하여 사용자 맞춤형 스트리밍 환경을 구축할 수 있는 유연성을 제공한다. 

 

1. IAM 역할 생성

MediaConvert Role 

AWS에서 VOD 자동화를 구현하려면 AWS MediaConvert가 사용할 IAM 역할이 필요하다. MediaConvert는 S3에서 비디오를 읽고, 변환 결과를 다시 저장해야 하므로 S3 접근 권한이 포함된 역할이 필요하다.

MediaConvert 콘솔에서 “AWS 서비스에서 MediaConvert 선택” 통해 역할을 생성하면, 필요한 권한이 포함된 IAM 역할이 자동 생성된다.

  • IAM -> 역할 -> 역할 생성

MediaConvert를 선택하면 자동으로 2개의 정책이 추가되어 있다. 현재 API Gateway는 사용하지 않아 정책이 필요없지만 그대로 다음역할을 사용하여 테스트를 진행하도록 하겠다. 

이름을 MediaConverRole로 지정해주고 생성해주겠다. 

Lambda Role 

두 번째로 필요한 역할은 AWS Lambda 함수용 IAM 역할이다. 이 역할은 Lambda가 MediaConvert 작업을 시작하고, S3 버킷에 접근할 수 있도록 구성해야 한다. 다음과 같이 먼저 Lambda 역할 부터 생성해준다. 

 

정책은 직접 JSON으로 작성하여 하나의 정책만으로 필요한 모든 권한을 포함시켰다.

이 정책에는 로그 기록을 위한 logs:* 권한, MediaConvert 작업을 생성하고 관리하기 위한 mediaconvert:* 권한, S3에서 파일을 읽고 쓰기 위한 s3:* 권한이 포함되어 있다. 또한, Lambda가 MediaConvert용 역할을 위임받아 사용할 수 있도록 iam:PassRole 권한도 함께 설정하였다.이 정책을 Lambda역할에 연결시주면 된다. 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "Logging"
        },
        {
            "Action": ["iam:PassRole"],
            "Resource": ["자신의 MediaConvertRole의 ARN"],
            "Effect": "Allow",
            "Sid": "PassRole"
        },
        {
            "Action": ["mediaconvert:*"],
            "Resource": ["*"],
            "Effect": "Allow",
            "Sid": "MediaConvertService"
        },
        {
            "Action": ["s3:*"],
            "Resource": ["*"],
            "Effect": "Allow",
            "Sid": "S3Service"
        }
    ]
}

2. S3 생성 및 권한 설정

실제 운영 환경에서는 S3 버킷을 두 개로 분리하여, 하나는 Input 용, 다른 하나는 Output 용으로 사용하는 것이 일반적이다. 이렇게 분리하면 Lambda 함수가 같은 버킷을 반복해서 트리거하는 재귀 호출 문제를 방지할 수 있어, 불필요한 리소스 사용과 비용 증가를 줄일 수 있다. 하지만 이번 실습에서는 간단한 테스트 목적이므로, 단일 S3 버킷 내에 디렉터리 구조로 Input과 Output 경로를 구분하여 사용하도록 하겠다. 따라서 하나의 범용 버킷만 생성하고, 내부 경로만 나누어 구성한다.

그리고 단일 S3 버킷 내에 input/ 및 output/ 폴더를 생성하여 경로를 분리한다. input/ 폴더는 사용자가 원본 파일을 업로드할 때 사용되는 경로이며, output/ 폴더는 AWS MediaConvert가 변환된 결과 파일을 저장하는 용도로 사용된다. 

3. Lambda 생성

lambda코드는 AWS sample 깃허브를 참고하여 작성하였다. 다음 깃허브링크를 로컬에 다운받고 압축을 해제해준다. 
MediaConvert-WorkflowWatchFolderAndNotification 폴더에서 convert.py 와 job.json 파일을 이용하여 테스트를 진행할 것이다. 

github 링크

다음 Lambda함수를 작성해준다. 런타임은 python 3.8 역할은 기존에 만들어두었던 VODLambdaBasicExec 역할을 선택해준다.

함수를 생성후에 github에서 다운 받은 소스코드를 lambda에 업로드 해준다. zip파일형태로 올리거나 CLI를 이용해서 올려도 무방하다. 

또한 Lambda 함수의 런타임 핸들러 설정을 변경해주어야 한다. AWS Lambda의 핸들러 규칙은 [파일명].[메서드명] 형식을 따르며, 이 규칙에 따라 Lambda가 이벤트 발생 시 어떤 코드를 실행할지를 결정한다. 이번 실습에서는 업로드한 파일 중 convert.py가 Lambda의 동작을 담당한다. 이 파일 안에 정의된 handler 메서드를 호출하도록 설정해야 한다. 따라서 Lambda 콘솔의 핸들러 입력란에는 convert.handler로 지정한다.

다음은 Python 코드에서 설정한 환경 변수 값을 설정해줘야 한다. 다음과 같이 환경변수의 값을 설정해준다. 애플리케이션 유형은 VOD로 설정해주었다. 

  • Application = VOD
    MediaConvertRole = [ MediaConvertRole의 ARN]
    DestinationBucket = [버킷이름/output/]

환경변수를 설정했으면 마지막으로 Lambda와 S3를 트리거 해준다. 
이벤트 유형에는 모든객체 생성 이벤트를 선택해주고 접두사 옵션을 통해 input/경로를 사용할 수 있도록 설정해준다.

이제 모든 설정은 끝났으니 S3 버킷에 mp4파일을 업로드하여 테스트를 진행해보도록 하겠다. 

결과 

다음과 같이 S3 input경로에 test.mp4 파일 하나를 업로드 해주었다. 

버킷의 output 경로를 확인하니 정상적으로 변환된 모습을 확인 할 수 있었다. 

현재 사용 중인 job.json 파일에는 총 세 개의 출력 그룹(Output Group)이 설정되어 있다. 첫 번째는 HLS 출력 그룹으로, 비디오를 360p, 540p, 720p의 세 가지 해상도로 트랜스코딩하여 HLS 스트리밍에 적합한 형태로 출력되도록 구성되어 있다. 두 번째는 MP4 출력 그룹으로, 720p 해상도의 단일 MP4 파일을 생성하며 다운로드 및 저장용으로 활용된다. 마지막은 Thumbnail 출력 그룹으로, 입력된 비디오에서 5초마다 한 프레임씩 이미지를 캡처하여 썸네일로 출력한다.

이제 원하는 대로 job.json 파일을 자신의 요구에 맞게 수정하여 VOD 스트리밍을 사용할 수 있다.

'AWS' 카테고리의 다른 글

[AWS] EFS  (0) 2024.12.31
[AWS] EBS 용량 축소하기  (0) 2024.12.31
[AWS] Image Resizing 파이프라인 구축  (0) 2024.12.31
[AWS] Cloudfront + S3 정적 웹사이트 배포  (0) 2024.12.31
[AWS] Cloudtrail vs Config  (0) 2024.11.20