AWS MediaConvert를 이용하여 영상을 스트리밍할 때 HLS 프로토콜이 사용된다.

애플에서 개발한 HLS 프로토콜의 특징에 대해서 간단히 정리해보았다.

HLS(HTTP 라이브 스트리밍)

  • HLS는 비디오 파일을 다운로드할 수 있는 HTTP 파일 조각으로 나누고 HTTP 프로토콜을 이용해 전송
  • 클라이언트는 이러한 HTTP 파일을 로드한 후 비디오로 재생
  • 모든 인터넷 장치가 HTTP를 지원하기 때문에 간단하게 실행 가능
  • HLS 스트리밍은 재생에 지장을 주지 않고 네트워크 상태에 따라 비디오 품질을 높이거나 낮출 수 있다.
  • 미디어 파일을 한 번에 모두 보내는 대신 한 번에 조금씩 지속적으로 사용자 장치에 보냄
  1. 서버
    • 인코딩 : 비디오 포맷 재설정 -> 모든 장치가 데이터를 인식하도록
    • 조각화 : 비디오는 몇 초 길이(10초 정도)의 세그먼트로 쪼개짐
      • 세그먼트로 나누고, 세그먼트의 인덱스 파일(m3u8)을 만들어 세그먼트의 순서를 기록
      • HLS는 480p, 720p, 1080p 등 다양한 품질로 여러 세트 세그먼트 복제
  2. 배포
    • 일반적으로 CDN을 사용하여 여러 지역으로 배포. 스트리밍을 캐시하여 클라이언트에 더 신속히 전송 가능
  3. 클라이언트
    • 인덱스 파일(m3u8)을 참조하여 비디오를 순서대로 조합하고 필요에 따라 품질을 높이거나 낮춤

How to use MediaConvert & Lambda & S3

  1. 인풋 s3 버킷 생성

  2. 아웃풋 파일을 담을 s3 버킷 생성

  3. s3의 [속성] 탭에 들어가서 정적 웹 사이트 호스팅 활성화 (박스에 index.html 추가)

  4. [권한] 탭에서 모든 퍼블릭 액세스 차단 해제

  5. CORS 구성에 들어가서 다음 내용 추가

    [
        {
            "AllowedHeaders": ["*"],
            "AllowedMethods": ["PUT", "POST", "DELETE"],
            "AllowedOrigins": ["http://www.example1.com"],
            "ExposeHeaders": []
        },
        {
            "AllowedHeaders": ["*"],
            "AllowedMethods": ["PUT", "POST", "DELETE"],
            "AllowedOrigins": ["http://www.example2.com"],
            "ExposeHeaders": []
        },
        {
            "AllowedHeaders": [],
            "AllowedMethods": ["GET"],
            "AllowedOrigins": ["*"],
            "ExposeHeaders": []
        }
    ]
  6. MediaConvert를 경유하기 위한 IAM Role 설정

    • IAM 서비스 접속
    • [역할 생성] 클릭
    • MediaConvert 클릭하고 [다음:검토] 나올 때까지 넘어가기
    • 이름에 MediaConvertRole 입력
    • [역할 생성] 클릭
    • [요약] 들어가서 ARN 값 저장해놓기 (다음 단계에 사용)
  7. Lambda를 위한 IAM Role 설정

  • VODLambdaRole이란 이름으로 IAM 역할 생성 / 역할 타입은 AWS Lambda
  • AWSLambdaBasicExecutionRole 정책을 attach (for CloudWatch logs permission) - [권한] 탭에서 [인라인 정책 추가] - [Json] 탭 클릭
  • 추가한 정책 내 [인라인 정책 추가]에 들어가서 [JSON] 누른 다음 내용 추가
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "*",
                "Effect": "Allow",
                "Sid": "Logging"
            },
            {
                "Action": ["iam:PassRole"],
                "Resource": ["ARNforMediaConvertRole"],
                "Effect": "Allow",
                "Sid": "PassRole"
            },
            {
                "Action": ["mediaconvert:*"],
                "Resource": ["*"],
                "Effect": "Allow",
                "Sid": "MediaConvertService"
            },
            {
                "Action": ["s3:*"],
                "Resource": ["*"],
                "Effect": "Allow",
                "Sid": "S3Service"
            }
        ]
    }
  • ARNforMediaConvertRole라고 적힌 Resource 부분을 지우고 아까 저장했던 ARN 값으로 대체
  • 이름에 VODLambdaPolicy 입력하고 정책 생성
  1. 비디오 변환을 위한 Lambda 함수 작성

    • [Lambda 함수 생성] 클릭
    • Name에 VODLambdaConvert 입력
    • Python 3.8 입력
    • Role을 [기존 역할 선택] 누른 후 VODLambdaRole 선택
    • job.json convert.py를 다운 받아 zip으로 압축
    • 함수에서 Configuration 탭에 들어가 [zip 파일 업로드] 선택
    • 압축 파일을 업로드하고, handler를 convert.handler 로 수정
    • 환경 변수를 다음과 같이 입력
      • DestinationBucket = <outputput bucket name>
      • MediaConvertRole = arn:aws:iam::ACCOUNT NUMBER:role/MediaConvertRole
      • Application = VOD
  2. Lambda 함수 테스트 - test 이벤트에 다음 json 파일 추가

    {
        "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"
            }
        ]
    }
    • save이후 test를 눌렀을 때 200값이 반환되면 성공적으로 세팅됨
  3. Lambda 함수에 input S3 bucket을 트리거로 설정

    • trigger를 눌러 input S3 bucket을 연동하면 되며
    • 이벤트 같은 경우는 모든 객체 생성 으로 설정
    • prefix에 inputs/ 등을 입력하여 입력 폴더를 지정할 수도 있다.
    • 해당 s3 버킷에 영상을 업로드했을 때 output 버킷에 변환된 영상 디렉토리가 생성되면 성공적으로 MediaConvert가 작동 된 것임. CloudWatchMediaConvert의 Job list에서도 성공적으로 실행된 것을 확인 할 수 있다.

Reference

+ Recent posts