본문 바로가기

개발 기록/AWS

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

반응형

* S3 버킷 및 람다함수 모두 서울 리전으로 적용 가능하오니 참고 부탁드립니다

 

출처 ) https://github.com/aws-samples/aws-media-services-vod-automation/blob/master/MediaConvert-WorkflowWatchFolderAndNotification/README-tutorial.md

 

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

위 링크는 구축 방법에 대해 영문으로 설명되어 있으며, 링크에 나온 방법을 활용하여 적어놓았습니다.

 

회사 서비스에 동영상 스트리밍이 들어갈것 같아 이것저것 찾아보던중 aws cloudfront+s3+mediaconvert를 결합하는 방법을 찾아내었다.

 

AWS CloudFront + S3 + MediaConvert Flow

위 Flow를 설명하자면 다음과 같습니다.

 

1. 동영상을 S3버킷에 특정 디렉토리에 업로드

2. Lambda edge가 트리거 이벤트를 발생시켜서 원본 이미지를 MediaConvert에 전달

3. 전달받은 MediaConvert는 HLS(Http Live Streaming) 확장자 파일을 생성 후 해당 S3버킷에 저장

4. 동영상 시청자는 HLS 확장자로 시청 (3초간격 실시간 스트리밍)

5. 첫 시청시간만큼 CloudFront는 캐싱 처리함

6. 이후 시청하는 시청자는 CloudFront에서 캐싱한 스트리밍 동영상을 시청함 

 

이 구조로 스트리밍을 하게되면 동영상 스트리밍 트래픽 부하를 효과적으로 줄일 수 있을거 같았고, 구축까지 해보았습니다.

 

이 글에선 구축 방법을 다시 한번 정리해보도록 하겠습니다.

 

* 현재 Lambda edge가 서울을 지원하지 않기 때문에 버지니아 북부 (us-east-1) 기준으로 설정하였습니다.

 

1. AWS S3 버킷 생성

AWS S3 버킷 생성

 * 버킷을 생성시 Lambda @edge를 버지니아 북부 (us-east-1)에 생성해야 하고 버킷도 같은 리전이어야 하기 때문에 리전을 Lambda @edge 리전과 동일하게 맞추셔야 합니다.

 

* 버킷 권한 설정

버킷 정책

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

 

 

 

* 버킷 CORS 권한 설정

버킷 CORS 설정

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

 

2. 역할1 만들기 (MediaConvert 정책 만들기)

 

  - MediaConvert 사례를 클릭하여 다음 클릭

 

MediaConvert 역할 만들기

 

- 기본 설정된 값으로 "다음" 클릭

역할 권한 정책은 기본 정책으로 설정함

 - 역할 이름은 'MediaConvertRole'로 정의 및 생성 합니다.

 

3. 역할2 만들기 (Lambda 정책 만들기)

  * 람다 함수 관련한 역할 및 정책을 신규 생성합니다.

 

   - 역할 사례 지정

   - 권한 정책 연결

- 역할 이름을 "VODLambdaRole"로 정의 후 생성합니다.

 - 생성한 "VODLambdaRole" 검색 및 클릭 후 정책 연결 클릭

 

- 정책 생성 클릭

 

 - 정책 JSON 소스 적용하기 (* IAM접근식별번호는 별도로 기입해주세요!)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "Logging"
        },
        {
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::IAM접근고유번호:role/MediaConvertRole"
            ],
            "Effect": "Allow",
            "Sid": "PassRole"
        },
        {
            "Action": [
                "mediaconvert:*"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow",
            "Sid": "MediaConvertService"
        },
        {
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow",
            "Sid": "S3Service"
        }
    ]
}

4. Lambda @edge 함수 생성

 - 람다 서비스 접속 및 버지니아 북부로 Lamda 함수 생성

 - 함수 정보 기입

 - github 소스를 다운로드 받음

- convert.py, job.json 파일 zip파일로 압축 및 생성

 

 - 함수 코드 .zip 파일 업로드 변경 및 zip파일 업로드 후 핸들러 명을 convert.handler로 수정

- "+트리거 추가" 클릭 후 S3 검색 및 지정

- 트리거 환경 설정 (이벤트 유형 , 접두사 기입)

  ex) S3 버킷에 inputs 경로에 PUT 이벤트가 발생 할 경우 자동으로 Lambda @edge 및 MediaConvert 처리가 발생함

 

* 필자는 convert.py 소스에 112~113 라인을 삭제하였습니다.

 

- 테스트 코드 작성

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

- 결과 아래 코드에서 확인

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

 - S3 버킷 inputs 경로에 mp4 파일 업로드 해보기

 

- MediaConvert 서비스 이동 후 작업에 해당 파일 처리 확인

 

- S3 버킷 폴더 생성 확인 (HLS, MP4, Thumbnails)

- HLS 파일이 화질에 따라 자동 생성 되었음을 확인

 

5. CloudFront 생성 및 버킷 연결

- Create Distribution 클릭

- Web으로 생성

- CloudFront 설정 (Origin Domain Name은 해당 버킷 선택하면 됨)

 - Whitelist Headers Add 후 생성

 

반응형