본문 바로가기

Media Services/MediaStore

AWS MediaStore

오랜만에 업데이트... 요새 딴 일을 하느라...🙏

아무툰...

AWS MediaStore는 Live 스트리밍 전용으로 메모리 기반의 S3로 이해하면 된다. 그러니까 실시간 레이턴시가 중요한 Live 미디어 서비스의 MediaStore 사용을 권장한다.  S3만큼 여러 기능도 없다. 그냥 easy easy...

 

보편적인 Live Streaming 구성

[Encoder Appliance] -> [MediaLive] -> [MediaStore] -> [CloudFront] 

 

MediaStore를 사용 시에는 MediaLive에서 endpoint에 mediastore(ssl)://mediastoreEndpoint/main 입력 시 main.m3u8으로 매니페스트 파일이 생성된다.

 

그럼 언제  MediaStore를 사용해야 하고, 어떨때는 MediaPackge를 사용해야 할까?

MediaStore는 단순 메모리 기반 저장 스토리지로 MediaLive에서 모든 미디어 패키징을 끝낼 경우 사용한다.

 

MediaLive를 사용하는데, 컨텐츠의 재패키징 예를 들어 DRM, 자막 처리, 광고 등 Live 미디어 스트리밍에 대한 추가 재가공이 필요할 경우는 MediaPackge를 사용해야 한다. 

MediaLive에서도 해당 기능은 대부분 가능하지만, 가령 CP(Contents Provider) 사 등에서 MediaLive Origin Source를 보내 줄 경우가 있을 것이다.

아무튼 미디어 소스의 재패키징이 필요할 때는 MediaPackage를 써야겠지?

 

현재는 MediaPackage나, MediaStore나 모두 Failover 구성(MediaLive의 Pause)이 가능하기 때문에, 굳이 재패키징이 필요 없다면 MediaStore를 사용하자.

 

마지막으로 확인해야 할 부분은 MediaStore의 TPS(RPS)가 PUT: 100 / GET: 1000 이다. 만약 TPS가 1000 이상 발생될 것으로 예상된다면 AWS 측에 Case Open을 통해 증설해야 한다. 물론 CloudFront에서 캐싱이 이루어지기 때문에 실제 TPS는 1000 이상 나오기 힘들 듯 하다.

 

아래는 MediaStore의 Policy 샘플(MediaStore 다이렉트 or CF 연동)

 

Sample Policy

{
  "Version" : "2012-10-17",
  "Statement" : [ {
    "Sid" : "PublicReadOverHttps",
    "Effect" : "Allow",
    "Principal" : "*",
    "Action" : [ "mediastore:GetObject", "mediastore:DescribeObject" ],
    "Resource" : "arn:aws:mediastore:ap-northeast-2:4151525159:container/live/*",
    "Condition" : {
      "Bool" : {
        "aws:SecureTransport" : "true"
      }
    }
  }, {
    "Sid" : "CloudFrontRead",
    "Effect" : "Allow",
    "Principal" : "*",
    "Action" : [ "mediastore:GetObject", "mediastore:DescribeObject" ],
    "Resource" : "arn:aws:mediastore:ap-northeast-2:44643626169:container/live/*",
    "Condition" : {
      "StringEquals" : {
        "aws:UserAgent" : "lee_local"
      },
      "Bool" : {
        "aws:SecureTransport" : "true"
      }
    }
  } ]
}

 

 

Sample CORS Policy

[
  {
    "AllowedHeaders": [
      "*"
    ],
    "AllowedMethods": [
      "GET"
    ],
    "AllowedOrigins": [
      "*"
    ],
    "MaxAgeSeconds": 3000
  },
  {
    "AllowedHeaders": [
      "x-amzn*"
    ],
    "AllowedMethods": [
      "GET",
      "PUT"
    ],
    "AllowedOrigins": [
      "*"
    ],
    "MaxAgeSeconds": 0
  }
]

 

    {
      "Sid": "PublicReadOverHttpOrHttps",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "mediastore:GetObject",
        "mediastore:DescribeObject"
      ],
      "Resource": "arn:aws:mediastore:ap-northeast-2:011032282144:container/mediastore_a/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": [
            "true",
            "false"
          ]
        }
      }
    }