본문 바로가기
공부/프로그래밍

[aws] MediaConvert + lambda 를 이용해 원하는 화질로 파일 분리하기

by demonic_ 2021. 5. 10.
반응형

동영상을 보면 화질별로 감상할 수 있는데 그게 한파일을 여러개로 보이는게 아니라 여러개로 Convert 한 것이다. 그래서 이번 설정은 S3에 영상을 올리면 설정해둔 화질에 맞게 Convert하여 저장하는 것을 다룬다. 그래서 실질적으로 진행되는 것은 다음과 같다

 

S3에 영상을 올리면 -> Lambda로 mediaConver를 사용해 화질을 분리한다.

 

 

총 3개의 단계로 구성된다.

1. IAM 역할 만들기

2. S3 설정하기

3. Lambda 만들기

 

그럼 시작

 

# IAM 역할 만들기

역할을 2개 만들어야 한다.

1. MediaConvertRole

2. VodLambdaRole(labmda를 실행할 권한)

 

 

역할 1 생성(MediaConvertRole)

 

 

2개의 권한이 검색되어 있다

 

이름을 MediaConvertRole 로 설정하고 생성

 

검색해서 해당 역할을 찾은 후 상세보기를 한다. ARN 의 내용을 메모장에 복사해야 하는데 추후 Lambda 환경변수 값을 넣기 위해서다. Lambda 실행할 때 MediaConver의 권한을 쓰기 때문.

 

 

역할 2 생성 (VodLambdaRole)

이번엔 Lambda를 생성한다

 

다음 권한을 검색해서 체크, 다음을 누른다

 

VODLambdaBasicExec 이름으로 생성한다.

 

갓 만든 역할을 찾아 상세보기로 들어간 다음 인라인 정책 추가를 클릭한다.

 

JSON을 클릭한다음 다음을 추가한다.

Resource 부분에 이전에 MediaConverRole에서 복사한 ARN을 삽입한다.

{
    "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"
        }
    ]
}

 

다음처럼 4개의 권한이 보인다. 이름을 넣고 다음을 누른다.

 

다음처럼 추가되어 있다.

 

 

 

# S3 설정

이제 S3 버킷을 만든다. 버킷은 총 2개를 등록하라고 권장한다. 하나는 원본이 저장될 버킷(input), 그리고 하나는 변형후 저장될(output) 버킷이다. 이렇게 만드는 이유는 lambda를 만드는 도중에 다음과 같은 경고메시지 때문이다. 재귀호출로 인한 비용이 늘어날 수 있음을 경고.

 

그래도 일단 여기선 1개의 버킷으로 할 예정이며 다만 input/ 과 output/을 등록하여 저장하도록 하겠다.

input/ 원본 저장 경로

output/ 결과물 저장 버킷

 

버킷을 생성한 후에는 원본을 저장할 버킷(mytest-vod-input) 에 들어가 권한탭을 클릭해 버킷 정책을 다음으로 삽입한다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[버킷이름]/*"
        }
    ]
}

 

행여 다음의 에러가 날 수 있는데 엑세스 설정때문이다.

 

이것은 버킷의 정책이 해당 정책을 수용하지 못해서 그런데 퍼블릭 액세스 차단 설정으로 가서 3번째 설정인 '새 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단'의 체크를 푼다.

 

그리고 다시 가서 정책을 설정한다.

 

그럼 이제 lambda 함수를 생성하자.(업로드시 MediaConvert를 수행할 lambda)

 

 

 

 

# Lambda 생성하기

함수생성을 클릭한다. 이후 파이썬 3.8 버전을 선택한다. 이름을 등록하고 실행 역할은 위에서 만든 VODLambdaBasicExec 를 등록한 후 함수를 생성한다.

 

 

함수에 등록할 코드를 다음 github에 들어가 코드를 다운받는다.

https://github.com/aws-samples/aws-media-services-vod-automation

 

aws-samples/aws-media-services-vod-automation

Sample code and CloudFormation scripts for automating Video on Demand workflows on AWS - aws-samples/aws-media-services-vod-automation

github.com

 

다운받은 파일 압축을 해제한 후 MediaConvert-WorkflowWatchFolderAndNotification 폴더에 들어가면 convert.py 와 job.json 파일이 있다.

 

이 두 파일을 zip으로 압축한 뒤 람다에 등록한다.

혹시모르니 둘을 합친 압축파일을 여기 추가.

vod-lambda.zip
0.00MB

 

다음처럼 코드가 등록된다.

 

그리고 런타임 설정을 해줘야한다. 런타임 핸들러에 규칙은 [파일명].[메서드명] 인데 업로드한 파일에서 convert.py 가 그 역할을 할 것이고 그 안에 handler 를 호출할 것이기 때문에 다음처럼 설정한다

convert.handler

 

그럼 트리거를 등록하기 전에 테스트를 진행하는게 좋은데 그러기위해선 2가지를 해야한다.

 

1. 환경변수 설정

2. 테스트 등록

 

1번을 우선 진행해보자.

구성 -> 환경변수에 들어가 다음처럼 설정한다.

 

DestinationBucket, MediaConvertRole, Application을 입력한다.

Application = VOD

MediaConvertRole = [위에서 등록한 MediaConvertRole의 ARN]

DestinationBucket = [output 버킷이름]

 

참고로 DestinationBucket를 입력할때 output/ 경로에 저장할 것이기 때문에 [버킷이름]/output/ 으로 등록했다. 그리고 경로가 겹치면(대체로 파일명이겠지만) 이전 파일을 덮어쓰게 된다. 주의.

 

이제 테스트 탭으로 들어가 다음을 입력하여 진행한다.

테스트의 내용을 아래 내용으로 채운다.

{
    "Records": [
        {
            "eventVersion": "2.0",
            "eventTime": "2017-08-08T00:19:56.995Z",
            "requestParameters": { "sourceIPAddress": "54.240.197.233" },
            "s3": {
                "configurationId": "90bf2f16-1bdf-4de8-bc24-b4bb5cffd5b2",
                "object": {
                    "eTag": "2fb17542d1a80a7cf3f7643da90cc6f4-18",
                    "key": "vodconsole/TRAILER.mp4",
                    "sequencer": "005989030743D59111",
                    "size": 143005084
                },
                "bucket": {
                    "ownerIdentity": { "principalId": "" },
                    "name": "rodeolabz-us-west-2",
                    "arn": "arn:aws:s3:::rodeolabz-us-west-2"
                },
                "s3SchemaVersion": "1.0"
            },
            "responseElements": {
                "x-amz-id-2": "K5eJLBzGn/9NDdPu6u3c9NcwGKNklZyY5ArO9QmGa/t6VH2HfUHHhPuwz2zH1Lz4",
                "x-amz-request-id": "E68D073BC46031E2"
            },
            "awsRegion": "us-west-2",
            "eventName": "ObjectCreated:CompleteMultipartUpload",
            "userIdentity": { "principalId": "" },
            "eventSource": "aws:s3"
        }
    ]
}

 

테스트 버튼을 클릭한다.

실행 결과가 성공으로 뜬다 하더라도 세부정보를 꼭 확인해야 한다. 여기서 성공은 lambda의 실행을 의미하는 것이지 해당 프로세스가 수행되었다는 의미는 아니다.

세부정보에서 statusCode가 200 으로 온것을 확인하면 된다.

 

이제 S3에 접속해서 실제로 생성되었는지 확인해보자.

 

수행이 잘 되었음을 확인했다.

 

이제 트리거에 S3를 등록하자

버킷명을 입력하고 이벤트 유형은 모든 객체 생성 이벤트로, 그리고 접두사에 input/ 을 입력한다

 

인터넷에 보면 이벤트유형에 PUT으로 하라는 경우가 있었는데, 내 경우 그렇게 할때 테스트는 되더라도 막상 input/에다가 파일을 추가하면 되지 않았었다. 그래서 여기선 모든 객체 생성 이벤트를 걸기로 했다.

 

이제 input/ 에 파일을 업로드 해보자.

 

CloudWatch를 보면 수행로그가 찍힌다. 이중에 하나를 클릭해서 상세보기를 했다.

로그 끝쯤에 input 파일에 대한 정보가 있다.

 

s3의 output/ 을 보면 다음 경로를 볼 수 있다.

HLS 파일로 쪼개진 것도 확인.

 

 

기타:

파일을 분리하는데 사용되는 코드는 위에서 언급한 github에서 다운받았는데

https://github.com/aws-samples/aws-media-services-vod-automation

 

aws-samples/aws-media-services-vod-automation

Sample code and CloudFormation scripts for automating Video on Demand workflows on AWS - aws-samples/aws-media-services-vod-automation

github.com

 

해당 코드에서는 다음 4가지 화질을 만든다.

HLS: 360, 540, 720

mp4: 720

그 외 thumbnail(썸네일) 다수

이것을 설정하는 파일은 job.json 인데 보면 상세히 알 수 있다.

 

 

끝.


 

추가:

lambda 에서 테스트 하는데 다음과 같은 500 에러가 날때.

{
  "statusCode": 500,
  "body": "{}",
  "headers": {
    "Content-Type": "application/json",
    "Access-Control-Allow-Origin": "*"
  }
}

 

S3에 저장하는데 실패한 것이다. iam 정책을 저장할 때 S3 권한이 포함되어야 하는데 빠질경우 그렇다. iam에 들어간 뒤 VOD관련 설정(여기서는 VODLambdaBasicExec)에서 다음 권한 있는지 확인

...
        {
            "Action": ["s3:*"],
            "Resource": ["*"],
            "Effect": "Allow",
            "Sid": "S3Service"
        }
...        

 

 

추가2:

CloudFront에 OAI를 설정해 두었다면 S3에 다음처럼 설정이 되어있을것이다.

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [origin access identity]"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[버킷이름]/*"
        }
    ]
}

그런데 위 본문에서 다음의 설정이 있다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[버킷이름]/*"
        }
    ]
}

 

그럼 이럴땐 어떻게 해야할까?. 아래거를 무시하고 위의 설정만 있어도 동영상 convert, 그리고 CloudFront의 OAI가 제기능 한다.

실 적용 정책:

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [origin access identity]"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[버킷이름]/*"
        }
    ]
}

 

 

 

참고:

https://realwater87.tistory.com/2

 

AWS CloudFront+S3+Lambda edge+MediaConvert를 활용한 온디맨드 스트리밍

* S3 버킷 및 람다함수 모두 서울 리전으로 적용 가능하오니 참고 부탁드립니다 출처 ) https://github.com/aws-samples/aws-media-services-vod-automation/blob/master/MediaConvert-WorkflowWatchFolderAndNoti..

realwater87.tistory.com

http://proxyolism.egloos.com/m/1940711

 

S3에 upload하면 Lambda로 MediaConvert를 동작시키고 변환된 파일을 S3에 넣기 (AWS Lambda, AWS S3, AWS Mediaconv

https://github.com/aws-samples/aws-media-services-simple-vod-workflow 위의 링크를 따라 만들어봤고 적용 해보았다. 할려고 하는 workflow는 다음과 같다. S3에 미디어파일(영상 or 음악) 업로드 -> 업로드 Event가 발생

proxyolism.egloos.com

https://github.com/aws-samples/aws-media-services-vod-automation

 

aws-samples/aws-media-services-vod-automation

Sample code and CloudFormation scripts for automating Video on Demand workflows on AWS - aws-samples/aws-media-services-vod-automation

github.com

https://dev.classmethod.jp/articles/aws-cli-cloudfront-oai-kr/

 

AWS CLI로 Amazon CloudFront OAI (Origin Access Identity) 설정하기 | DevelopersIO

AWS CLI을 이용하여 CloudFront Distribution에 OAI를 설정하는 방법에 대해 다루어 보았어요.

dev.classmethod.jp

 

반응형

댓글