

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 를 사용하여 MediaTailor 및 CDN 자동화 CloudFormation
<a name="automating-cdn-integration"></a>

를 사용하여 콘텐츠 전송 네트워크(CDN) AWS Elemental MediaTailor 를 자동화하면 광고 삽입 워크플로가 AWS CloudFormation 간소화되고 안정성이 향상됩니다.

이 섹션에서는 AWS CloudFormation (코드 서비스형AWS 인프라)를 사용하여 콘텐츠 전송 네트워크(CDN) AWS Elemental MediaTailor 로 자동으로 설정하는 방법을 보여줍니다. 이전 섹션에 설명된 대로이 통합을 수동으로 구성할 수 있지만를 사용하면 단일 템플릿으로 전체 프로세스를 자동화하여 시간을 CloudFormation 절약하고 오류를 줄일 수 있습니다.

를 처음 사용하는 경우 필요한 모든 AWS 리소스를 정의하는 템플릿 파일을 생성할 수 있는 서비스 CloudFormation입니다. 이 템플릿을 배포하면가 해당 리소스를 CloudFormation 자동으로 생성하고 구성하여 리소스가 올바르게 연동되도록 합니다.

에 대한 자세한 내용은 [CloudFormation 사용 설명서를](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) CloudFormation참조하세요. 의 MediaTailor 리소스 유형에 대한 자세한 CloudFormation내용은 [AWS::MediaTailor 리소스 유형 참조를 참조하세요](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_MediaTailor.html).

**Topics**
+ [를 사용하는 이유 AWS CloudFormation](cloudformation-benefits.md)
+ [배포 준비](prepare-cloudformation-deployment.md)
+ [템플릿 배포](deploy-cloudformation-template.md)
+ [배포된 리소스 사용](use-deployed-resources.md)
+ [배포 테스트 및 검증](test-validate-deployment.md)
+ [배포 관련 문제 해결](troubleshoot-deployment-issues.md)
+ [템플릿 사용자 지정](customize-cloudformation-template.md)
+ [템플릿 참조](cloudformation-template-reference.md)

# MediaTailor 및 CDN 통합 CloudFormation 에를 사용하는 이유
<a name="cloudformation-benefits"></a>

AWS Elemental MediaTailor 를 사용한 자동화 AWS CloudFormation 는 스트리밍 워크플로를 관리하는 브로드캐스트 전문가에게 상당한 이점을 제공합니다. 콘텐츠 전송 네트워크(CDN)를 사용하여 MediaTailor를 수동으로 구성하면 시간이 많이 걸리고 오류가 발생하기 쉽습니다. CloudFormation 자동화를 사용하면 다음과 같은 이점이 있습니다.
+ **일관성**: 매번 동일한 구성이 배포되도록 하여 인적 오류를 줄입니다.
+ **버전 관리**: 변경 사항을 추적하기 위해 인프라를 버전 관리 시스템에 코드로 저장합니다.
+ **빠른 배포**: 수동 구성 시간이 아닌 몇 분 만에 복잡한 구성을 배포합니다.
+ **환경 복제**: 개발, 테스트 및 프로덕션 환경 전반에서 구성을 쉽게 복제합니다.
+ **설명서**: 템플릿 자체는 인프라에 대한 설명서 역할을 합니다.

자동화된 워크플로를 수동 구성과 비교하는 방법은 다음과 같습니다.


| 수동 설정(여러 단계) | 자동 설정(단일 템플릿) | 
| --- | --- | 
| MediaTailor 재생 구성 생성 | 파라미터가 있는 CloudFormation 템플릿 1개 배포 | 
| CloudFront 배포 생성 | 
| 캐시 동작 구성 | 
| 보안 구성 설정 | 

CloudFront를 사용하여 MediaTailor를 설정하는 자동화된 워크플로는 다음 단계를 따릅니다.

1. 콘텐츠 오리진 및 광고 서버 파라미터와 함께 CloudFormation 템플릿 배포

1. CloudFormation 는 필요한 모든 리소스를 생성하고 구성합니다.
   + 광고 삽입을 위한 MediaTailor 재생 구성
   + 적절한 캐시 동작이 있는 CloudFront 배포
   + 콘텐츠 보호를 위한 보안 구성

1.  CloudFormation 출력을 사용하여 광고 지원 스트림 URLs 액세스

1. 동적으로 삽입된 광고로 콘텐츠 스트리밍

# CDN 및 MediaTailor 통합 CloudFormation 배포 준비
<a name="prepare-cloudformation-deployment"></a>

AWS Elemental MediaTailor 를 사용한 배포에는 특정 사전 조건 및 준비 단계가 AWS CloudFormation 필요합니다. MediaTailor와 Amazon CloudFront를 통합 CloudFormation 하기 위해 로 작업을 시작하기 전에 다음이 있는지 확인합니다.
+ MediaTailor, CloudFront 및 CloudFormation 리소스를 생성할 수 있는 권한이 있는 AWS 계정
+ 비디오 콘텐츠가 호스팅되는 콘텐츠 오리진(예: AWS Elemental MediaPackage Amazon S3 또는 다른 오리진 서버)
+ VAST 요청에 응답할 수 있는 광고 결정 서버(ADS)

 CloudFormation 템플릿을 배포하기 전에 다음과 같은 필수 파라미터를 수집합니다.

`AdServerUrl`  
동적 광고 삽입을 위한 VAST 광고 서버의 URL입니다. 테스트를 위해 정적 VAST 엔드포인트가 제공됩니다.

`ContentOriginDomainName`  
프로토콜이 없는 콘텐츠 오리진의 도메인 이름(예: *mediapackage-domain.mediapackagev2.us-west-2.amazonaws.com*, *mybucket.s3.amazonaws.com* 또는 *custom-origin.example.com*). http:// 또는 https:// 접두사 또는 경로를 포함하지 마십시오.

`ContentOriginType`  
콘텐츠 오리진의 유형:  
+ *mediapackagev2*: AWS Elemental MediaPackage 오리진의 경우
+ *s3*: Amazon S3 버킷 오리진의 경우
+ *사용자 지정*: 다른 오리진 유형의 경우

템플릿은 개인화된 광고로 콘텐츠를 제공하기 위해 함께 작동하는 여러 AWS 리소스를 생성합니다. 다음은 각 구성 요소가 수행하는 작업을 설명합니다.

## 오리진 액세스 제어
<a name="origin-access-control-resource"></a>

오리진 액세스 제어(OAC)는 오리진 서버에서 직접 액세스하지 않고 CloudFront를 통해서만 콘텐츠에 액세스할 수 있도록 하는 보안 기능입니다. 이렇게 하면 무단 액세스로부터 콘텐츠를 보호할 수 있습니다.

MediaPackage 및 Amazon S3 오리진의 경우 템플릿은 콘텐츠에 대한 액세스를 보호하기 위한 오리진 액세스 제어(OAC) 리소스를 생성합니다.

## MediaTailor 재생 구성
<a name="mediatailor-resource"></a>

MediaTailor 재생 구성은 광고 삽입을 처리하는 핵심 구성 요소입니다. 오리진에서 콘텐츠를 수신하고, 광고 서버에서 광고를 요청하고, 이를 각 뷰어에 대한 개인화된 스트림으로 결합합니다.

템플릿은 다음 설정을 사용하여 MediaTailor 재생 구성을 생성합니다.
+ CloudFront 배포를 가리키는 비디오 콘텐츠 소스
+ 지정된 VAST 엔드포인트에 구성된 광고 결정 서버 URL
+ 라이브 스트림 중 광고 삽입을 위한 라이브 프리롤 구성
+ 적절한 세그먼트 URL 접두사가 있는 CDN 구성

## CloudFront 배포
<a name="cloudfront-resource"></a>

CloudFront 배포는 짧은 지연 시간으로 전 세계 시청자에게 콘텐츠를 제공합니다. 다양한 유형의 요청(매니페스트, 콘텐츠 세그먼트, 광고 세그먼트)을 처리하고 적절한 오리진으로 라우팅합니다.

CDNs을 처음 사용하는 브로드캐스트 전문가의 경우 몇 가지 주요 용어는 다음과 같습니다.

Origin  
원본 콘텐츠가 저장되는 서버(예: MediaPackage 또는 Amazon S3)

캐시 동작  
다양한 유형의 콘텐츠를 캐싱하고 전송하는 방법을 결정하는 규칙

캐시 정책  
콘텐츠가 캐시되는 기간과 캐싱에 영향을 미치는 요청 구성 요소를 제어하는 설정

템플릿은 다음 구성 요소를 사용하여 CloudFront 배포를 생성합니다.
+ 세 가지 오리진:
  + 콘텐츠 오리진(MediaPackage, Amazon S3 또는 사용자 지정)
  + MediaTailor 매니페스트 오리진
  + MediaTailor 세그먼트 오리진
+ 적절한 패턴으로 동작을 캐시합니다.
  + 콘텐츠 세그먼트의 기본 동작
  + MediaTailor 광고 세그먼트에 대한 동작(/tm/\$1)
  + MediaTailor 중간 미디어(/v1/i-media/\$1)에 대한 동작
  + 개인화된 매니페스트에 대한 동작(/v1/\$1)
  + 세그먼트 리디렉션 요청에 대한 동작(/segment/\$1)
+ 각 동작에 최적화된 캐시 정책:
  + `CachingOptimized` 캐시 가능한 콘텐츠의 경우
  + `CachingDisabled` 개인화된 매니페스트용
+ 적절한 헤더 전달을 보장하기 위한 오리진 요청 정책
+ CORS 지원을 위한 응답 헤더 정책

# CDN 및 MediaTailor 통합을 위한 CloudFormation 템플릿 배포
<a name="deploy-cloudformation-template"></a>

AWS Elemental MediaTailor AWS CloudFormation 템플릿을 사용한 배포는 템플릿이 생성할 내용을 이해하면 간단합니다. 이 프로세스는 약 15\$130분이 소요되며, CloudFront 배포 배포를 기다리는 데 대부분의 시간이 소요됩니다.

 CloudFormation 템플릿을 배포하고 자동 광고 삽입 워크플로를 설정하려면:

**MediaTailor CloudFormation 템플릿을 배포하려면**

1.  AWS Elemental MediaTailor GitHub 리포지토리에서 CloudFormation 템플릿을 다운로드하거나에서 복사합니다[AWS CloudFormation AWS Elemental MediaTailor 및 Amazon CloudFront 통합에 대한 템플릿 참조](cloudformation-template-reference.md).

1. [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/home)을 엽니다.

1. **스택 생성** > **새 리소스 사용(표준)**을 선택합니다.

1. **템플릿 지정**에서 **템플릿 파일 업로드**를 선택하고 템플릿을 업로드합니다.

1. 스택 이름을 입력하고 필요한 파라미터의 값을 입력합니다.
   + **AdServerUrl**: VAST 광고 서버의 URL(예: https://*your-ad-server.com*/vast)
   + **ContentOriginDomainName**: 프로토콜이 없는 콘텐츠 오리진의 도메인 이름(예: *mediapackage-domain.mediapackagev2.us-west-2.amazonaws.com*)
   + **ContentOriginType**: 콘텐츠 오리진 유형을 선택합니다.
     + *mediapackagev2*: 오리진의 경우 AWS Elemental MediaPackage 
     + *s3*: Amazon S3 버킷 오리진의 경우
     + *사용자 지정*: 다른 오리진 유형의 경우

1. 구성을 검토하고 **스택 생성을** 선택합니다.

1. 스택 생성이 완료될 때까지 기다립니다. 일반적으로 5\$110분이 걸립니다. **이벤트** 탭에서 진행 상황을 모니터링할 수 있습니다.

1. 완료되면 **출력** 탭으로 이동하여 HLS 및 DASH 매니페스트의 URLs을 찾습니다.

**참고**  
를 콘텐츠 오리진 AWS Elemental MediaPackage 으로 사용하는 경우 MediaPackage 엔드포인트가 올바르게 구성되고 액세스할 수 있는지 확인합니다. 자세한 내용은 [MediaPackage CDN 통합](mediapackage-integration.md) 단원을 참조하십시오.

# CDN 및 MediaTailor 통합에 CloudFormation 배포된 리소스 사용
<a name="use-deployed-resources"></a>

AWS Elemental MediaTailor AWS CloudFormation 스택에서 배포한 리소스는 광고 삽입을 통해 콘텐츠에 액세스하는 데 사용할 몇 가지 중요한 출력을 제공합니다. CloudFormation 스택이 성공적으로 생성되면 출력을 사용하여 광고가 삽입된 콘텐츠에 액세스하는 방법을 이해해야 합니다. 이는 수동 설정에서 MediaTailor URLs을 사용하는 방법과 비슷하지만 CloudFormation 배포는 이러한 URLs 자동으로 제공합니다.

배포에 성공하면 CloudFormation 스택은 광고 삽입을 통해 콘텐츠에 액세스하는 데 사용할 몇 가지 중요한 출력을 제공합니다.

`CloudFrontDomainName`  
CloudFront 배포의 도메인 이름(예: *d1234abcdef.CloudFront.net*)

`HlsManifestUrl`  
광고 삽입이 포함된 HLS 매니페스트의 기본 URL(예: https://*d1234abcdef.CloudFront.net*/v1/master/*12345*/*my-playback-config*/)

`DashManifestUrl`  
광고 삽입이 포함된 DASH 매니페스트의 기본 URL(예: https://*d1234abcdef.CloudFront.net*/v1/dash/*12345*/*my-playback-config*/)

`MediaTailorPlaybackConfigName`  
생성된 MediaTailor 재생 구성의 이름(예: *my-stack-PlaybackConfig*)

## 재생 URLs 구성
<a name="construct-playback-urls"></a>

광고가 포함된 콘텐츠의 전체 재생 URL을 생성하려면 CloudFormation 출력의 기본 URL을 특정 매니페스트 경로와 결합해야 합니다. 이는 브로드캐스트 전문가가 이해해야 할 중요한 단계입니다. 기존 콘텐츠를 광고 삽입 시스템과 연결하기 때문입니다.

1. 출력에서 적절한 매니페스트 URL로 시작합니다.

   ```
   HlsManifestUrl: https://d1234abcdef.CloudFront.net/v1/master/12345/my-playback-config/
   ```

1. 특정 매니페스트 경로를 추가합니다.

   ```
   Your manifest path: channel/index.m3u8
   ```

1. 전체 재생 URL은 다음과 같습니다.

   ```
   https://d1234abcdef.CloudFront.net/v1/master/12345/my-playback-config/channel/index.m3u8
   ```

비디오 플레이어에서이 URL을 사용하여 동적으로 삽입된 광고로 콘텐츠를 재생합니다.

**작은 정보**  
매니페스트 경로가 무엇인지 잘 모르는 경우 오리진 서버를 확인합니다. MediaPackage 오리진의 경우 엔드포인트의 HLS 또는 DASH 매니페스트 경로입니다. Amazon S3 오리진의 경우 버킷 내 매니페스트 파일의 경로입니다.

MediaTailor URL 구조에 대한 자세한 내용은 섹션을 참조하세요[MediaTailor와 CDN 통합 설정](cdn-configuration.md).

## 비디오 플레이어 구성
<a name="configure-video-player"></a>

재생 URL이 있으면 이를 사용하도록 비디오 플레이어를 구성해야 합니다. 브로드캐스트 전문가의 경우 이는 모든 HLS 또는 DASH 스트림에 대해 플레이어를 구성하는 것과 비슷하지만 이제 스트림에 개인화된 광고가 포함됩니다. 다음은 인기 HLS.js 플레이어를 사용하는 간단한 예입니다.

```
<!DOCTYPE html>
<html>
<head>
    <title>MediaTailor Playback Example</title>
    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body>
    <video id="video" controls style="width: 640px; height: 360px;"></video>
    
    <script>
        const video = document.getElementById('video');
        const mediaUrl = 'https://<replaceable>d1234abcdef.CloudFront.net</replaceable>/v1/master/<replaceable>12345</replaceable>/<replaceable>my-playback-config</replaceable>/<replaceable>channel/index.m3u8</replaceable>';
        
        if (Hls.isSupported()) {
            const hls = new Hls();
            hls.loadSource(mediaUrl);
            hls.attachMedia(video);
        } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = mediaUrl;
        }
    </script>
</body>
</html>
```

다음과 같은 전문 브로드캐스트 플레이어를 사용할 수도 있습니다.
+ JW 플레이어
+ Bitmovin 플레이어
+ THEOplayer
+ Video.js

MediaTailor와의 플레이어 통합에 대한 자세한 내용은 섹션을 참조하세요[MediaTailor 광고 서버 통합 요구 사항](vast.md).

# CDN 및 MediaTailor 통합을 위한 CloudFormation 배포 테스트 및 검증
<a name="test-validate-deployment"></a>

AWS Elemental MediaTailor 배포 검증은 라이브로 전환하기 전에 브로드캐스트 전문가에게 중요한 단계입니다. 이 섹션에서는 배포를 테스트하여 광고가 제대로 삽입되고 콘텐츠가 원활하게 전달되는지 확인하는 방법을 안내합니다.

 CloudFormation 템플릿을 배포한 후 다음 단계에 따라 설정이 올바르게 작동하는지 확인합니다.

**MediaTailor 및 CloudFront 통합을 테스트하려면**

1. 콘솔에서 모든 리소스가 CloudFormation 성공적으로 생성되었는지 확인합니다.

1. MediaTailor [콘솔에서 MediaTailor ](https://console.aws.amazon.com/mediatailor/home)재생 구성이 활성 상태인지 확인합니다.

1. CloudFront [콘솔에서 CloudFront ](https://console.aws.amazon.com/CloudFront/home)배포가 배포되고 활성화되어 있는지 확인합니다.

1. 샘플 매니페스트를 사용하여 재생을 테스트합니다.

   1. 에 설명된 대로 전체 재생 URL을 구성합니다[재생 URLs 구성](use-deployed-resources.md#construct-playback-urls).

   1. HLS 또는 DASH를 지원하는 비디오 플레이어(예: VLC, JW 플레이어 또는 AWS 콘솔 플레이어)를 사용합니다.

   1. 콘텐츠 재생 및 광고가 예상 중단점에 삽입되었는지 확인합니다.

1. CloudWatch의 MediaTailor 로그에서 광고 삽입 오류가 있는지 확인합니다.

광고 삽입을 테스트할 때 성공 지표를 찾아보세요.
+ 콘텐츠와 광고 간의 원활한 전환
+ 광고는 예상 브레이크 포인트(프리롤, 미드롤, 포스트롤)에 표시됩니다.
+ 광고 품질이 콘텐츠 품질과 일치
+ 광고 전환 중 버퍼링 또는 재생 오류 없음

자세한 테스트 절차는 섹션을 참조하세요[AWS Elemental MediaTailor 광고 삽입 동작 이해](ad-behavior.md). 포괄적인 CDN 통합 테스트 및 검증은 섹션을 참조하세요[CDN 및 MediaTailor 통합 테스트 및 검증](cdn-integration-testing.md).

# CDN 및 MediaTailor 통합의 일반적인 CloudFormation 배포 문제 해결
<a name="troubleshoot-deployment-issues"></a>

AWS Elemental MediaTailor 배포 또는 재생 중에 자동화를 사용해도 배포 문제가 발생할 수 있습니다. 방송 전문가는 이러한 문제를 해결하는 방법을 이해하면 광고 삽입을 통해 안정적인 스트리밍 서비스를 유지하는 데 도움이 됩니다.

 CloudFormation 배포 또는 결과 MediaTailor 및 CloudFront 통합에 문제가 발생하는 경우 다음과 같은 일반적인 문제 및 솔루션을 참조하세요.

## CloudFormation 배포 문제
<a name="deployment-troubleshooting"></a>

"리소스 생성 실패" 오류와 함께 스택 생성 실패  
**가능한 원인:**  
+ 잘못된 콘텐츠 오리진 도메인 이름 형식
+ 리소스를 생성할 수 있는 권한 부족
**해결 방법:** CloudFormation 이벤트 탭에서 특정 리소스 오류를 확인합니다. 콘텐츠 오리진 도메인 이름의 형식이 프로토콜 접두사나 경로 없이 올바른지 확인합니다. IAM 역할에 필요한 모든 리소스를 생성할 수 있는 충분한 권한이 있는지 확인합니다.

CloudFront 배포를 배포하는 데 시간이 오래 걸립니다.  
**원인:** CloudFront 배포를 완전히 배포하는 데 일반적으로 15\$130분이 걸립니다.  
**해결책:** 이것은 정상적 동작입니다. 테스트하기 전에 배포가 "배포" 상태에 도달할 때까지 기다립니다.

## 재생 및 광고 삽입 문제
<a name="playback-troubleshooting"></a>

콘텐츠가 재생되지만 광고가 삽입되지 않음  
**가능한 원인:**  
+ 광고 결정 서버가 응답하지 않거나 빈 VAST를 반환합니다.
+ 콘텐츠에 광고 마커가 포함되지 않음
**해결 방법:** 광고 서버에 액세스할 수 있고 유효한 VAST 응답을 반환하는지 확인합니다. 콘텐츠에 적절한 광고 마커(라이브 콘텐츠의 경우 SCTE-35 마커 또는 VOD의 경우 광고 중단 태그)가 있는지 확인합니다.

403 콘텐츠에 액세스할 때 금지되는 오류  
**가능한 원인:**  
+ 오리진 액세스 제어가 올바르게 구성되지 않음
+ 오리진 버킷 또는 엔드포인트 권한 문제
**해결 방법:** Amazon S3 오리진의 경우 버킷 정책이 CloudFront 배포에서 액세스를 허용하는지 확인합니다. MediaPackage 오리진의 경우 오리진 액세스 제어가 올바르게 구성되어 있고 엔드포인트에 액세스할 수 있는지 확인합니다.

재생 오류 또는 버퍼링  
**가능한 원인:**  
+ 캐시 동작 경로 패턴이 콘텐츠 경로와 일치하지 않음
+ 잘못된 오리진 도메인 구성
**해결 방법:** 캐시 동작에 요청을 적절한 오리진으로 라우팅하는 올바른 경로 패턴이 있는지 확인합니다. CloudFront 로그를 확인하여 요청을 처리하는 오리진을 확인하고 예상되는 오리진인지 확인합니다.

브로드캐스트 전문가의 경우 다음과 같은 추가 문제 해결 팁이 도움이 될 수 있습니다.
+ Amazon CloudWatch Logs Insights를 사용하여 MediaTailor 로그에서 특정 오류 패턴 검색
+ 프로덕션 광고 서버를 사용하기 전에 간단한 VAST 광고 서버(예: 템플릿에 제공된 기본 서버)로 먼저 테스트합니다.
+ 콘솔의 MediaTailor 매니페스트 검사기 도구를 사용하여 콘텐츠의 광고 마커 확인
+ 브라우저의 개발자 도구에서 네트워크 트래픽을 확인하여 광고 서버에 대한 요청이 올바르게 수행되고 있는지 확인합니다.

추가 문제 해결을 위해 MediaTailor 및 CloudFront 모두에 대한 CloudWatch CloudWatch 로그를 확인하여 특정 오류를 식별합니다.

# CDN 및 MediaTailor 통합을 위한 CloudFormation 템플릿 사용자 지정
<a name="customize-cloudformation-template"></a>

AWS Elemental MediaTailor 템플릿 사용자 지정을 사용하면 브로드캐스트 전문가가 특정 워크플로 요구 사항에 맞게 AWS CloudFormation 템플릿을 조정할 수 있습니다. 기본 템플릿은 많은 시나리오에서 작동하지만 이러한 사용자 지정은 더 복잡한 요구 사항을 해결하는 데 도움이 될 수 있습니다.

아래 예제에서는 템플릿에 추가할 수 있는 YAML 코드 조각을 보여줍니다. YAML 또는 CloudFormation 구문에 익숙하지 않은 경우 개발자 또는 AWS 솔루션 아키텍트와 협력하여 이러한 변경을 수행하는 것이 좋습니다.

특정 워크플로 요구 사항에 맞게 CloudFormation 템플릿을 사용자 지정할 수 있습니다.

## 오리진 추가 또는 수정
<a name="add-modify-origins"></a>

여러 콘텐츠 소스(예: 기본 및 백업 소스 또는 다른 콘텐츠 라이브러리)를 사용하는 브로드캐스트 워크플로의 경우 CloudFront 배포에 오리진을 추가할 수 있습니다.

```
Origins:
  # Add a new origin for additional content
  - Id: SecondaryContentOrigin
    DomainName: secondary-content.example.com
    CustomOriginConfig:
      OriginProtocolPolicy: 'https-only'
      OriginSSLProtocols: 
        - TLSv1.2
```

그런 다음 해당 캐시 동작을 추가하여 특정 패턴을이 오리진으로 라우팅합니다.

```
CacheBehaviors:
  - PathPattern: '/secondary-content/*'
    TargetOriginId: SecondaryContentOrigin
    ViewerProtocolPolicy: 'https-only'
    CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6  # Managed-CachingOptimized
```

## 사용자 지정 캐시 정책 생성
<a name="create-custom-cache-policies"></a>

특정 캐싱 요구 사항(예: 품질 선택 파라미터 또는 뷰어 인증)이 있는 브로드캐스트 워크플로의 경우 관리형 캐시 정책을 사용하는 대신 사용자 지정 캐시 정책을 생성할 수 있습니다. TTL 값 및 캐싱 전략에 대한 자세한 지침은 섹션을 참조하세요[CDN 및 MediaTailor 통합을 위한 캐싱 최적화](cdn-optimize-caching.md).

```
# Define a custom cache policy
CustomCachePolicy:
  Type: AWS::CloudFront::CachePolicy
  Properties:
    CachePolicyConfig:
      Name: !Sub '${AWS::StackName}-CustomCachePolicy'
      DefaultTTL: 86400  # 24 hours
      MaxTTL: 31536000   # 1 year
      MinTTL: 1          # 1 second
      ParametersInCacheKeyAndForwardedToOrigin:
        CookiesConfig:
          CookieBehavior: none
        HeadersConfig:
          HeaderBehavior: none
        QueryStringsConfig:
          QueryStringBehavior: whitelist
          QueryStrings:
            - quality
            - format

# Reference the custom policy in a cache behavior
CacheBehaviors:
  - PathPattern: '/custom-path/*'
    TargetOriginId: ContentOrigin
    ViewerProtocolPolicy: 'https-only'
    CachePolicyId: !Ref CustomCachePolicy
```

## MediaTailor 구성 개선
<a name="enhance-mediatailor-config"></a>

고급 광고 삽입 기능이 필요한 브로드캐스트 워크플로의 경우 광고 미리 가져오기(지연 시간 단축), 개인화 임계값 및 범퍼 광고와 같은 옵션으로 MediaTailor 구성을 개선할 수 있습니다.

```
MediaTailorPlaybackConfig:
  Type: AWS::MediaTailor::PlaybackConfiguration
  Properties:
    # Add ad prefetching for improved performance
    AvailSuppression:
      Mode: BEHIND_LIVE_EDGE
      Value: 00:00:00
    # Add personalization parameters
    PersonalizationThresholdSeconds: 2
    # Add bumper ads
    Bumper:
      StartUrl: https://example.com/bumper-start.mp4
      EndUrl: https://example.com/bumper-end.mp4
    # Other existing properties...
```

MediaTailor 구성 옵션에 대한 자세한 내용은 섹션을 참조하세요[AWS Elemental MediaTailor 를 사용하여 광고 삽입](configurations.md).

## 보안 기능 추가
<a name="add-security-features"></a>

특정 보안 요구 사항(지리적 제한 또는 DDoS 공격에 대한 보호 등)이 있는 브로드캐스트 워크플로의 경우 AWS WAF 통합 및 지리적 제한을 추가할 수 있습니다.

```
# Create a AWS WAF Web ACL
WebACL:
  Type: AWS::WAFv2::WebACL
  Properties:
    Name: !Sub '${AWS::StackName}-WebACL'
    Scope: CloudFront
    DefaultAction:
      Allow: {}
    VisibilityConfig:
      SampledRequestsEnabled: true
      CloudWatchMetricsEnabled: true
      MetricName: !Sub '${AWS::StackName}-WebACL'
    Rules:
      - Name: RateLimitRule
        Priority: 0
        Action:
          Block: {}
        VisibilityConfig:
          SampledRequestsEnabled: true
          CloudWatchMetricsEnabled: true
          MetricName: RateLimitRule
        Statement:
          RateBasedStatement:
            Limit: 1000
            AggregateKeyType: IP

# Reference the AWS WAF Web ACL in the CloudFront distribution
CloudFrontDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      WebACLId: !GetAtt WebACL.Arn
      # Add geo-restriction
      Restrictions:
        GeoRestriction:
          RestrictionType: whitelist
          Locations:
            - US
            - CA
            - GB
      # Other existing properties...
```

 CloudFormation 템플릿에 대한 자세한 내용은 [AWS CloudFormation 사용 설명서를](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) 참조하세요.

브로드캐스트별 CloudFormation 템플릿 및 예제는 [AWS Media Services 도구 GitHub 리포지토리](https://github.com/aws-samples/aws-media-services-tools)를 참조하세요.

# AWS CloudFormation AWS Elemental MediaTailor 및 Amazon CloudFront 통합에 대한 템플릿 참조
<a name="cloudformation-template-reference"></a>

AWS Elemental MediaTailor Amazon CloudFront와의 통합은 다음 전체 AWS CloudFormation 템플릿을 사용하여 자동화할 수 있습니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Description: | CloudFormation template that sets up AWS Elemental MediaTailor integration with CloudFront Distribution
  for server-side ad insertion. This template supports various content origins including MediaPackage, Amazon S3,
  and custom origins, making it versatile for different streaming architectures.

Parameters:
  AdServerUrl:
    Type: String
    Default: 'https://d1kbmkziz9rksx.CloudFront.net/VASTEndpoint.xml'
    Description: URL of the VAST ad server for dynamic ad insertion. Static VAST endpoint provided for testing. 

  ContentOriginDomainName:
    Type: String
    Description: |
      Domain name of your content origin without protocol (e.g., mediapackage-domain.mediapackagev2.us-west-2.amazonaws.com,
      mybucket.s3.amazonaws.com, or custom-origin.example.com).
      Do not include http:// or https:// prefixes or any paths.
    AllowedPattern: "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$"
    ConstraintDescription: Must be a valid domain name (e.g., example.com) without protocol or path components. IP addresses are not allowed.

  ContentOriginType:
    Type: String
    AllowedValues:
      - mediapackagev2
      - s3
      - custom
    Default: mediapackagev2
    Description: |
      The type of content origin:
      - mediapackagev2: AWS Elemental MediaPackage V2
      - s3: Amazon S3 bucket
      - custom: Any other custom origin

Resources:
  #---------------------------------------------------------------------------
  # Origin Access Control (for securing MediaPackage V2 and Amazon S3 origins)
  #---------------------------------------------------------------------------
  CloudFrontOriginAccessControl:
    Type: AWS::CloudFront::OriginAccessControl
    Condition: IsNotCustomOrigin
    Properties:
      OriginAccessControlConfig:
        Name: !Sub '${AWS::StackName}-OAC'
        OriginAccessControlOriginType: !Ref ContentOriginType
        SigningBehavior: always
        SigningProtocol: sigv4
        Description: Origin Access Control for content origin

  #---------------------------------------------------------------------------
  # MediaTailor Playback Configuration
  #---------------------------------------------------------------------------
  MediaTailorPlaybackConfig:
    Type: AWS::MediaTailor::PlaybackConfiguration
    Properties:
      Name: !Sub '${AWS::StackName}-PlaybackConfig'
      # The video content source should point to your CloudFront distribution
      VideoContentSourceUrl: !Sub 'https://${CloudFrontDistribution.DomainName}/'
      # The Ad Decision Server URL is where MediaTailor will request ads
      AdDecisionServerUrl: !Ref AdServerUrl
      # Configuration for pre-roll ads during live streams
      LivePreRollConfiguration:
        AdDecisionServerUrl: !Ref AdServerUrl
        MaxDurationSeconds: 30
      # CDN configuration for integrating with CloudFront
      CdnConfiguration:
        AdSegmentUrlPrefix: '/'
        ContentSegmentUrlPrefix: '/'
      # Set a reasonable manifest segment timeout
      ManifestProcessingRules:
        AdMarkerPassthrough:
          Enabled: false

  #---------------------------------------------------------------------------
  # CloudFront Distribution
  #---------------------------------------------------------------------------
  CloudFrontDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Enabled: true
        HttpVersion: http2and3
        IPV6Enabled: true
        Comment: !Sub 'Distribution for MediaTailor ad insertion with ${ContentOriginType} origin'
        
        # Default cache behavior points to the content origin
        DefaultCacheBehavior:
          TargetOriginId: ContentOrigin
          ViewerProtocolPolicy: 'https-only'
          # Using managed policies for optimal performance and simplicity
          CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6  # Managed-CachingOptimized
          OriginRequestPolicyId: 88a5eaf4-2fd4-4709-b370-b4c650ea3fcf # Managed-HostHeaderOnly
          ResponseHeadersPolicyId: eaab4381-ed33-4a86-88ca-d9558dc6cd63  # Managed-CORS-with-preflight-and-SecurityHeadersPolicy
          Compress: true
        
        # Define all the origins needed for the workflow
        Origins:
          # Main content origin (MediaPackage, Amazon S3, or Custom)
          - Id: ContentOrigin
            DomainName: !Ref ContentOriginDomainName
            # Apply Origin Access Control for secure origins
            OriginAccessControlId: !If [IsNotCustomOrigin, !GetAtt CloudFrontOriginAccessControl.Id, !Ref "AWS::NoValue"]
            # For custom origins, we need a CustomOriginConfig
            CustomOriginConfig:
              OriginProtocolPolicy: 'https-only'
              OriginSSLProtocols: 
                - TLSv1.2
              OriginKeepaliveTimeout: 5
              OriginReadTimeout: 30
              HTTPPort: 80
              HTTPSPort: 443
              
          # MediaTailor Manifests Origin - handles manifest manipulation for ad insertion
          - Id: MediaTailorManifests
            DomainName: !Sub 'manifests.mediatailor.${AWS::Region}.amazonaws.com'
            CustomOriginConfig:
              OriginProtocolPolicy: 'https-only'
              OriginSSLProtocols: 
                - TLSv1.2
              OriginKeepaliveTimeout: 5
              OriginReadTimeout: 30
            # Origin Shield improves caching efficiency 
            OriginShield:
              Enabled: true
              OriginShieldRegion: !Ref AWS::Region
              
          # MediaTailor Segments Origin - handles personalized ads
          - Id: MediaTailorSegments
            DomainName: !Sub 'segments.mediatailor.${AWS::Region}.amazonaws.com'
            CustomOriginConfig:
              OriginProtocolPolicy: 'https-only'
              OriginSSLProtocols: 
                - TLSv1.2
              OriginKeepaliveTimeout: 5
              OriginReadTimeout: 30
        
        # Cache behaviors to route specific request patterns to the right origin
        CacheBehaviors:
          # Handle MediaTailor segment requests for ad content which are cache-able
          - PathPattern: '/tm/*'
            TargetOriginId: MediaTailorSegments
            ViewerProtocolPolicy: 'https-only'
            CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6  # Managed-CachingOptimized
            OriginRequestPolicyId: 88a5eaf4-2fd4-4709-b370-b4c650ea3fcf  # Managed-HostHeaderOnly
            ResponseHeadersPolicyId: eaab4381-ed33-4a86-88ca-d9558dc6cd63  # Managed-CORS-with-preflight-and-SecurityHeadersPolicy
            Compress: true
            
          # Handle MediaTailor interstitial (SGAI) media requests which are cache-able
          - PathPattern: '/v1/i-media/*'
            TargetOriginId: MediaTailorManifests
            ViewerProtocolPolicy: 'https-only'
            CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6  # Managed-CachingOptimized
            OriginRequestPolicyId: 88a5eaf4-2fd4-4709-b370-b4c650ea3fcf  # Managed-HostHeaderOnly
            ResponseHeadersPolicyId: eaab4381-ed33-4a86-88ca-d9558dc6cd63  # Managed-CORS-with-preflight-and-SecurityHeadersPolicy
            Compress: true
            
          # Handle MediaTailor Personalized manifests which are not cache-able
          - PathPattern: '/v1/*'
            TargetOriginId: MediaTailorManifests
            ViewerProtocolPolicy: 'https-only'
            CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad # Managed-CachingDisabled
            OriginRequestPolicyId: 59781a5b-3903-41f3-afcb-af62929ccde1 # Managed-AllViewer
            ResponseHeadersPolicyId: eaab4381-ed33-4a86-88ca-d9558dc6cd63  # Managed-CORS-with-preflight-and-SecurityHeadersPolicy
            Compress: true
            
          # Handle MediaTailor segment *redirect* requests which are not cache-able (used for server side reporting)
          - PathPattern: '/segment/*'
            TargetOriginId: MediaTailorManifests
            ViewerProtocolPolicy: 'https-only'
            CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad # Managed-CachingDisabled
            OriginRequestPolicyId: 59781a5b-3903-41f3-afcb-af62929ccde1 # Managed-AllViewer
            ResponseHeadersPolicyId: eaab4381-ed33-4a86-88ca-d9558dc6cd63  # Managed-CORS-with-preflight-and-SecurityHeadersPolicy
            Compress: true

Conditions:
  IsNotCustomOrigin: !Not [!Equals [!Ref ContentOriginType, 'custom']]

Outputs:
  CloudFrontDomainName:
    Description: Domain name of the CloudFront distribution
    Value: !GetAtt CloudFrontDistribution.DomainName
    
  HlsManifestUrl:
    Description: URL for HLS manifest with ads inserted (append your manifest path)
    Value: !Sub 'https://${CloudFrontDistribution.DomainName}${MediaTailorPlaybackConfig.HlsConfiguration.ManifestEndpointPrefix}'
    
  DashManifestUrl:
    Description: URL for DASH manifest with ads inserted (append your manifest path)
    Value: !Sub 'https://${CloudFrontDistribution.DomainName}${MediaTailorPlaybackConfig.DashConfiguration.ManifestEndpointPrefix}'
    
  MediaTailorPlaybackConfigName:
    Description: Name of the MediaTailor playback configuration
    Value: !Ref MediaTailorPlaybackConfig
```