

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 自動化 MediaTailor 和 CDN CloudFormation
<a name="automating-cdn-integration"></a>

使用 AWS Elemental MediaTailor 搭配內容交付網路 (CDN) 進行自動化，可 AWS CloudFormation 簡化廣告插入工作流程並改善可靠性。

本節說明如何使用AWS AWS CloudFormation （基礎設施即程式碼服務） 自動 AWS Elemental MediaTailor 設定內容交付網路 (CDN)。雖然您可以如先前章節所述手動設定此整合，但使用 透過使用單一範本自動化整個程序來 CloudFormation 節省時間並減少錯誤。

如果您是初次使用 CloudFormation，這項服務可讓您建立範本檔案，以定義您需要的所有 AWS 資源。當您部署此範本時， CloudFormation 會自動為您建立和設定這些資源，以確保它們能正確運作。

如需 的詳細資訊 CloudFormation，請參閱[CloudFormation 《 使用者指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。如需 中 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)

# 為什麼使用 CloudFormation 進行 MediaTailor 和 CDN 整合
<a name="cloudformation-benefits"></a>

AWS Elemental MediaTailor 自動化搭配 為廣播專業人員 AWS CloudFormation 提供管理串流工作流程的顯著優勢。使用內容交付網路 (CDN) 手動設定 MediaTailor 可能會耗時且容易出錯。使用 CloudFormation 自動化提供下列優點。
+ **一致性**：確保每次都部署相同的組態，以減少人為錯誤。
+ **版本控制**：將您的基礎設施儲存為版本控制系統中的程式碼，以追蹤變更。
+ **快速部署**：在幾分鐘內部署複雜的組態，而不是數小時的手動組態。
+ **環境複寫**：輕鬆跨開發、測試和生產環境複寫組態。
+ **文件**：範本本身做為基礎設施的文件。

以下是自動化工作流程與手動組態的比較方式：


| 手動設定 （多個步驟） | 自動化設定 （單一範本） | 
| --- | --- | 
| 建立 MediaTailor 播放組態 | 使用參數部署一個 CloudFormation 範本 | 
| 建立 CloudFront 分佈 | 
| 設定快取行為 | 
| 設定安全組態 | 

使用 CloudFront 設定 MediaTailor 的自動化工作流程遵循下列步驟：

1. 使用內容原始伺服器和廣告伺服器參數部署 CloudFormation 範本

1. CloudFormation 會建立和設定所有必要的資源：
   + 廣告插入的 MediaTailor 播放組態
   + 具有適當快取行為的 CloudFront 分佈
   + 內容保護的安全組態

1. 使用 CloudFormation 輸出來存取已啟用廣告URLs

1. 使用動態插入的廣告串流您的內容

# 準備 CloudFormation 部署 CDN 和 MediaTailor 整合
<a name="prepare-cloudformation-deployment"></a>

AWS Elemental MediaTailor 的 部署 AWS CloudFormation 需要特定的先決條件和準備步驟。開始使用 CloudFormation 來整合 MediaTailor 和 Amazon CloudFront 之前，請確定您有下列項目。
+ 具有建立 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>

Origin Access Control (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 到 30 分鐘，大多數時間都在等待 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**：VATS 廣告伺服器的 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-10 分鐘。您可以在**事件**索引標籤中監控進度。

1. 完成後，導覽至**輸出**索引標籤以尋找 HLS 和 DASH 資訊清單URLs。

**注意**  
如果您使用 AWS Elemental MediaPackage 做為內容原始伺服器，請確定您的 MediaPackage 端點已正確設定且可存取。如需詳細資訊，請參閱[MediaPackage CDN 整合](mediapackage-integration.md)。

# 使用已 CloudFormation 部署的資源進行 CDN 和 MediaTailor 整合
<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-30 分鐘才能完全部署。  
**解決方案：**這是正常行為。等待分佈達到「已部署」狀態，再進行測試。

## 播放和廣告插入問題
<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 Tools 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 您可以使用下列完整 AWS CloudFormation 範本來自動化與 Amazon CloudFront 的整合：

```
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
```