AWS CloudFormation template reference for AWS Elemental MediaTailor and Amazon CloudFront integration
AWS Elemental MediaTailor integration with Amazon CloudFront can be automated using the following complete AWS CloudFormation template:
AWSTemplateFormatVersion: '2010-09-09' Description: | AWS 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
, orcustom-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-CORS-S3Origin 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-CORS-S3Origin 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: '/i-media/*' TargetOriginId: MediaTailorManifests ViewerProtocolPolicy: 'https-only' CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 # Managed-CachingOptimized OriginRequestPolicyId: 88a5eaf4-2fd4-4709-b370-b4c650ea3fcf # Managed-CORS-S3Origin 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: 33f36d7e-f396-46d9-90e0-52428a34d9dc # Managed-AllViewerAndCloudFrontHeaders-2022-06 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: 33f36d7e-f396-46d9-90e0-52428a34d9dc # Managed-AllViewerAndCloudFrontHeaders-2022-06 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