Amazon Web Services 한국 블로그

Amazon CloudFront와 AWS Media Services를 활용한 콘텐츠 전송 방법

AWS Media Services는 클라우드에서 안정적으로 브로드캐스트 품질의 비디오를 손쉽게 구축하는 데 사용되는 관리형 서비스 그룹입니다. 이러한 서비스는 라이브 및 온디맨드 스트리밍에 적합하고 뷰어의 재생 디바이스에 최적화된 미디어를 생성합니다. 이 게시물에서는 AWS Media Services에서 Amazon CloudFront를 사용하여 생성된 콘텐츠를 전송하는 방법을 설명합니다.

Amazon CloudFront는 짧은 지연 시간과 빠른 전송 속도로 웹 콘텐츠를 사용자에게 안전하게 전송하는 글로벌 CDN(콘텐츠 전송 네트워크)입니다. CloudFront는 뷰어와 가까운 곳에 위치한 140개가 넘는 엣지 로케이션으로 구성됩니다. CloudFront는 Amazon의 글로벌 인프라 전체에서 캐시, 요청 축소 및 TCP 최적화를 사용하여 콘텐츠 전송의 지연 시간을 줄입니다. 또한 CloudFront에는 대부분의 AWS 리전에 위치한 REC(Regional Edge Caches, 리전별 엣지 캐시)를 포함하며 이를 사용하여 중간 계층 캐시 같은 기능을 제공합니다.

지난해 AWS Media Services가 출시된 이후로 TVNZ의 2018년 영연방 경기 대회 방송 및 Sky News의 영국 왕실 결혼 보도 등 AWS Media Services와 CloudFront를 활용하여 정보와 엔터테인먼트 컨텐츠를 제공하는 고객들을 볼 수 있었습니다.

최근에는 AWS Media Services와 Amazon CloudFront 간의 새로운 통합 기능 2개가 추가되었습니다.

  1. AWS Elemental MediaPackage 채널을 생성하는 경우 CloudFront 배포를 생성하여 사용자에게 배포하는 옵션을 사용할 수 있습니다.
  2. CloudFront 콘솔의 드롭다운 목록에서 AWS Elemental MediaPackage 채널 및 AWS Elemental MediaStore 컨테이너를 사용자 지정 오리진으로 선택할 수 있습니다.

웹 사이트, 웹 API 및 소프트웨어 다운로드의 전송을 지원하는 것에 더해 CloudFront는 다수의 미디어 콘텐츠 전송을 지원합니다. CloudFront의 RTMP 배포는 RTMP 프로토콜을 지원하므로 온디맨드 미디어를 Adobe Flash 애플리케이션으로 전송할 수 있습니다. CloudFront의 웹 배포는 스트리밍 서버 애플리케이션을 실행하는 Amazon S3 또는 사용자 지정 오리진을 사용하여 프로그레시브 다운로드 및 적응형 HTTP 프로토콜(예: HLS, DASH, CMAF 및 Smooth Streaming)을 지원합니다. CloudFront는 오리진 자체가 Smooth Streaming을 지원하지 않는 경우 온디맨드 Smooth Streaming을 기본적으로 지원합니다(S3 또는 정적 웹 서버). 오리진이 Smooth Streaming을 지원하는 경우(예: AWS Elemental MediaPackage), CloudFront의 자체 지원은 활성화되지 않습니다. CloudFront의 미디어 전송 구성에 대한 자세한 내용은 설명서를 참조하십시오. 이 게시물에서는 CloudFront의 웹 배포를 사용한 미디어 전송에 대한 자세한 내용을 설명합니다.

여기서는 CloudFront를 사용하여 스트리밍 미디어를 전송하는 데 필요한 구성을 설명하지만, 모든 유형의 콘텐츠 전송에 적용 가능한 다른 CloudFront 기능도 구성해 보는 것이 좋습니다.

Amazon CloudFront를 사용하여 온디맨드 콘텐츠 전송

AWS Elemental MediaConvert는 미디어 콘텐츠 형식을 지정하고 압축하는 파일 기반 비디오 처리 서비스입니다. 이 콘텐츠를 Amazon S3 버킷에 저장한 후 CloudFront의 오리진으로 구성할 수 있습니다.

  • MediaConvert의 Smooth Streaming 출력은 CloudFront의 온디맨드 Smooth Streaming을 사용하여 전송할 수 있습니다.
  • 표준 HTTP 서비스를 사용할 수 있는 HLS 및 DASH의 기능을 사용하면 CloudFront 기본 구성을 사용하여 콘텐츠를 전송할 수 있습니다.
  • 다른 형식은 CloudFront에서 프로그레시브 다운로드를 사용하여 전송할 수 있습니다.

Amazon CloudFront를 사용하여 라이브 콘텐츠 전송

라이브 콘텐츠의 경우 CloudFront는 S3 오리진 대신 사용자 지정 오리진을 사용하도록 구성됩니다. 라이브 콘텐츠의 오리진으로 사용될 수 있는 AWS 미디어 서비스에는 세 가지가 있습니다.

  1. AWS Elemental MediaStore는 미디어 스토리지 서비스이며 라이브 스트림의 CloudFront 오리진으로 사용될 수 있습니다.
  2. AWS Elemental MediaPackage는 미디어 패키징 및 오리진 서비스이며 AWS Elemental MediaStore의 기능에 더해 추가 기능을 제공합니다. 여기에는 콘텐츠를 여러 스트리밍 프로토콜(예: HLS, DASH, CMAF 및 Smooth Streaming)로 재패키징하는 기능, DRM(디지털 권한 관리)을 사용하여 콘텐츠를 보호하는 기능과 최종 사용자를 위한 다시 시작 및 다시 보기 TV 같은 타임 시프팅 기능을 추가하는 기능이 포함됩니다.
  3. AWS Elemental MediaTailor는 미디어 개인 설정 및 수익 창출 서비스입니다. 다른 오리진 서비스(예: AWS Elemental MediaStore, AWS Elemental MediaPackage 또는 타사 스트리밍 서버)에서 콘텐츠를 가져와 ADS(Ad Decision Server)와 연계하여 시청자에게 맞춰진 광고를 삽입합니다.

이 세 가지 서비스를 사용하려면 라이브 미디어 스트림을 다양한 코덱, 비트 레이트 및 해상도로 인코딩하여 플레이어 최적화를 지원하는 트랜스코더가 필요합니다. AWS Elemental MediaLive는 라이브 미디어 트랜스코딩 서비스이며 인코딩된 미디어를 이러한 서비스로 전송하는 데 사용될 수 있습니다. 이 블로그 게시물을 준비하면서 저는 이 블로그 게시물에 상세히 설명된 지침에 따라 라이브 스트림을 AWS Elemental MediaLive 채널로 공급할 OBS Studio를 설정했습니다. 이제 AWS Elemental MediaStore, AWS Elemental MediaPackage 및 CloudFront를 구성하여 라이브 콘텐츠를 전송하는 방법을 설명하겠습니다.

AWS Elemental MediaStore 및 Amazon CloudFront를 사용하여 라이브 콘텐츠 전송

이 섹션에서는 [Custom] 오리진 유형을 사용하여 AWS Elemental MediaStore를 Amazon CloudFront의 오리진으로 구성합니다.

먼저, AWS Elemental MediaStore 콘솔로 이동하고 새 컨테이너를 생성한 후 ‘blogdemo’라는 이름을 지정합니다.

몇 분 후 컨테이너가 준비되면 목록에서 컨테이너를 선택합니다. [Info] 섹션에 있는 [Data Endpoint]를 기록합니다. 이 예에서는 https://suiv5ajqn2gown.data.mediastore.eu-west-1.amazonaws.com입니다.

각 AWS Elemental MediaStore 컨테이너에는 S3 버킷 정책과 유사한 IAM 리소스 정책이 있습니다. S3 버킷과 마찬가지로 AWS Elemental MediaStore 컨테이너는 기본적으로 프라이빗 컨테이너이므로 CloudFront가 컨테이너의 객체를 검색할 수 있도록 정책을 편집해야 합니다. AWS Elemental MediaStore 컨테이너에 사용자 지정 오리진 유형을 사용하지만 S3 오리진과 달리 오리진 액세스 ID를 사용하여 사용자 지정 오리진에 대한 액세스를 구성할 수는 없습니다. 그러므로 IAM 정책 조건을 사용하여 CloudFront가 AWS Elemental MediaStore에 대한 모든 요청에서 공유 암호를 전달하도록 정책을 설정합니다. 퍼블릭 액세스를 허용하도록 컨테이너 정책을 편집하고 HTTP User-Agent 헤더에 공유 암호의 값을 포함하도록 하는 IAM 조건도 설정합니다. 이 예에서는 임의 텍스트 문자열인 749DY68208KU77OOAAUJ를 생성했습니다. 아래에 컨테이너 정책이 나와 있으며 추가 문은 굵게 표시되어 있습니다. 이 문을 복사하는 경우 컨테이너의 리소스 ARN과 공유 암호를 편집하시기 바랍니다.


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "MediaStoreFullAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "mediastore:*",
      "Resource": "arn:aws:mediastore:eu-west-1:123456789012:container/blogdemo/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    },
    {
      "Sid": "CloudFrontRead",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "mediastore:GetObject",
        "mediastore:DescribeObject"
      ],
      "Resource": "arn:aws:mediastore:eu-west-1:123456789012:container/blogdemo/*",
      "Condition": {
        "StringEquals": {
          "aws:UserAgent": "749DY68208KU77OOAAUJ"
        },
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    }
  ]
}

AWS Elemental MediaStore 컨테이너가 구성되었으니 이제 CloudFront 콘솔로 이동하고 [Create Distribution]을 클릭한 다음 웹 배포의 설명 아래에서 [Get Started]를 클릭합니다. [Create Distribution] 페이지에서 [Origin Domain Name] 텍스트 상자를 클릭하면 나타나는 [MediaStore Containers] 섹션의 드롭다운에서 컨테이너의 도메인을 선택합니다(suiv5ajqn2gown.data.mediastore.eu-west-1.amazonaws.com). [Origin Protocol Policy]를 [HTTPS Only]로 설정하고 [Origin Custom Header]를 이름 User-Agent 및 값 749DY68208KU77OOAAUJ(공유 암호)를 사용하여 지정합니다. [Create Distribution]을 클릭합니다.

오리진의 로드를 줄이기 위해 CloudFront는 기본적으로 4xx 및 5xx 오류 응답을 5분간 캐시합니다. 일부 미디어 플레이어에서는 라이브 스트리밍 오리진에서 미디어 세그먼트가 제공되기 전에 미디어 세그먼트 요청을 시도할 수 있습니다. 콘텐츠가 아직 제공되지 않은 경우 오리진은 HTTP 404 “Not Found” 상태를 반환하고 일반적으로 플레이어는 잠시 후에 요청을 반복합니다. CloudFront의 404 응답에 대한 기본 5분의 캐시는 재생 문제를 야기할 수 있습니다. 세그먼트를 사용할 수 있게 된 후 잠시 동안 캐시된 응답을 플레이어에 반환하기 때문입니다. 그러므로 CloudFront의 [Error Caching Minimum TTL]을 낮은 값으로 설정하겠습니다. 콘솔에서 배포를 선택하고 [Error Pages] 탭을 선택한 후 [Create Custom Error Response]를 클릭합니다. [HTTP Error Code]에 대해 [404: Not Found]를 선택하고 [Error Caching Minimum TTL]에 대해 1초를 선택한 후 [Create]를 클릭합니다.

이것으로 AWS Elemental MediaStore 컨테이너 및 CloudFront 배포 구성이 완료되었습니다. 이제 CloudFront를 통해 라이브 스트림을 최종 사용자에게 전송할 수 있습니다. AWS Elemental MediaStore 컨테이너로 전송하는 라이브 스트림의 이름은 blogdemo/live.m3u8이고, CloudFront 도메인 이름은 d3nyydyvkfisf9.cloudfront.net이므로 재생을 위한 URL은 https://d3nyydyvkfisf9.cloudfront.net/blogdemo/live.m3u8이 됩니다.

AWS Elemental MediaPackage 및 Amazon CloudFront를 사용하여 라이브 콘텐츠 전송

AWS Elemental MediaPackage는 Just-in-Time 패키지 및 DVR 유사 기능과 라이브 비디오 스트림에 대한 오리진을 제공합니다. AWS Elemental MediaPackage 채널의 출력 엔드포인트는 HLS, DASH, CMAF 또는 Smooth Streaming이 될 수 있으며 모두 HTTP를 통해 전송됩니다.

Elemental MediaPackage 콘솔로 이동하고 새 채널을 생성합니다.

채널 blogdemo를 생성하고 DASH, Smooth Streaming 및 HLS를 엔드포인트에 구성한 후 이 엔트포인트로 콘텐츠를 전송하도록 AWS Elemental MediaLive 채널을 다시 구성합니다.

MediaPackage 채널을 생성할 때 가장 쉬운 옵션은 동시에 CloudFront 배포를 생성하는 것입니다.

CloudFront 배포가 생성되면(일반적으로 몇 분 정도 걸림) MediaPackage 콘솔에서 [Show CloudFront URL]을 클릭하여 채널의 CloudFront 배포와 엔드포인트의 CloudFront URL에 대한 세부 정보를 확인할 수 있습니다.

그러나 MediaPackage에서 CloudFront 배포를 생성하지 않으려는 경우에는 어떻게 해야 할까요? 이 기능이 제공되기 전에 채널 또는 배포를 생성한 경우, 자체 파라미터를 사용하여 직접 배포를 생성하려는 경우 또는 여러 오리진을 동일한 배포(예: 웹 사이트의 정적 콘텐츠를 호스팅하는 웹 서버)에 통합하려는 경우에는 CloudFront 배포를 생성하지 않고 MediaPackage 채널을 생성하면 됩니다.

이렇게 하면 채널의 엔드포인트에 MediaPackage URL만 포함되고 CloudFront URL이 엔드포인트에 연결되지 않습니다.

모든 엔드포인트의 도메인 이름이 c223d9abb67d57c7.mediapackage.eu-west-1.amazonaws.com으로 동일하므로 CloudFront 배포에 단일 오리진만 생성하고 기본 CloudFront 캐시 동작을 사용하여 이 오리진으로 요청을 전달할 수 있습니다.

앞서 MediaStore에 대해 생성한 것과 유사한 CloudFront 웹 배포를 생성합니다. [Origin Domain Name]을 클릭할 때 나타나는 [MediaPackage Origins] 섹션의 드롭다운에서 엔드포인트의 도메인 이름을 선택하고 [HTTPS Only]를 선택합니다.

기본적으로 CloudFront는 요청의 쿼리 문자열을 오리진에 전달하지 않습니다. MediaPackage는 쿼리 문자열 값 ‘m’, ‘start’ 및 ‘end’를 사용하므로 이러한 값을 전달하도록 CloudFront를 구성하고 맨 아래에 있는 [Create Distribution] 버튼을 클릭합니다.

앞서 MediaStore에 대해 생성한 배포에서 설명한 것과 같이 배포의 사용자 지정 오류 응답을 구성하여 404 오류에 대해 낮은 캐싱 TTL을 설정합니다.

MediaPackage는 화이트리스트를 통해 IP 주소를 제한하는 방법으로 액세스를 제어하므로 CloudFront에 사용되는 IP 주소에 대한 액세스가 제한될 가능성이 있습니다. 이러한 IP 주소는 주기적으로 업데이트되는 JSON 파일에 게시됩니다. JSON 파일이 업데이트된 경우 AWS Elemental MediaPackage 채널의 IP 액세스를 업데이트해야 합니다. 자세한 내용은 AWS IP 주소 범위를 참조하십시오.

이것으로 AWS Elemental MediaPackage 채널 및 CloudFront 배포 구성이 완료되었습니다. 이제 CloudFront를 통해 도메인 이름을 사용하여 라이브 스트림을 최종 사용자에게 전송할 수 있습니다. 예를 들어 배포에 대한 채널의 도메인 이름(https://dq3czjb5i9win.cloudfront.net/out/v1/5f0bf817ce1f4ac7846f9fad427b15f2/index.mpd)을 대체하여 DASH 엔드포인트를 CloudFront를 통해 사용할 수 있습니다.

CORS(Cross-Origin Resource Sharing)

대부분의 웹 브라우저는 한 ‘오리진’에서 호스팅되는 웹 페이지에서 다른 ‘오리진’의 콘텐츠에 액세스하는 것을 제한합니다. 이 컨텍스트에서 ‘오리진’은 CDN 오리진이 아니라 웹 사이트(정확히 말하면 https://www.test.com 같은 URL의 스키마 및 권한)를 의미합니다. 많은 브라우저가 참조된 오리진 소유자에게 액세스를 허용하는 메커니즘을 제공하는 CORS(Common Origins Resource Sharing)를 지원합니다.

플레이어 웹 페이지와 미디어 스트림을 동일한 도메인에서 호스팅하는 경우 CORS가 필요하지 않습니다. 단일의 CloudFront 배포에서 웹 콘텐츠(로드 밸런서 또는 S3 버킷 뒤의 웹 서버 플릿 사용)와 미디어 콘텐츠에 사용할 여러 CloudFront 오리진을 구성하여 정확히 이 작업을 수행할 수 있습니다.

다수의 참조 CORS 오리진을 지원해야 하는 경우(예: 사이트 전체에 콘텐츠를 배포하는 경우) 서비스에서 기본 제공되는 CORS 기능을 사용할 수 있습니다.

  • S3 및 AWS Elemental MediaStore 모두 버킷 및 컨테이너에 대한 CORS 정책 구성을 지원합니다. 자세한 내용은 S3AWS Elemental MediaStore 설명서를 참조하십시오.
  • Elemental MediaPackage는 기본적으로 CORS를 지원합니다. 요청의 ‘Origin’ 헤더 값이 설정된 경우 이 값으로 ‘Access-Control-Allow-Origin’ HTTP 응답 헤더 설정을 반환하고 그렇지 않은 경우 ‘*’로 반환합니다.

이 지침에 따라 CORS를 준수하도록 CloudFront를 구성해야 합니다. 특정 CORS 오리진의 콘텐츠에 대한 액세스를 제한하려면 AWS WAF를 활용하여 HTTP 요청의 헤더에 지정되지 않은 CORS 오리진의 액세스를 거부할 수 있습니다.

요약

이 게시물에서는 AWS Media Services로 생성된 스트리밍 미디어 콘텐츠를 Amazon CloudFront를 사용하여 안전하게 전송하는 데 필요한 구성을 설명했습니다.

이 글은 AWS Media Blog의 Using Amazon CloudFront and AWS Media Services의 한국어 번역본으로 신능선 AWS 테크니컬 매니저가 감수하였습니다.