AWS Media Services
AWSOfficialPublished by AWS
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured framework for managing end-to-end video streaming pipelines using AWS Media Services. It acts as an orchestrator that enforces mandatory rule-loading sequences to ensure configurations adhere to service constraints, security best practices, and performance requirements. It covers the full lifecycle of live, linear, and VOD workflows, including ingest, encoding, packaging, ad insertion, and CDN delivery.
What it does
- Provides a mandatory dependency-based workflow for building and modifying streaming pipelines.
- Enforces the loading of specific service rules to prevent configuration errors.
- Offers a comprehensive troubleshooting guide for cross-service signal chain issues.
- Includes a discovery checklist to gather requirements before resource deployment.
- Defines strict startup and shutdown sequences for live streaming events.
- Provides best practices for cost optimization and resilience in media architectures.
When to use it
- When building or modifying live, linear, or VOD video streaming workflows.
- When troubleshooting errors, latency, or sync issues across AWS media services.
- When auditing existing configurations for compliance or performance optimization.
- When planning a new media project and needing to understand service dependencies.
- When configuring complex features like SCTE-35 ad insertion, DRM, or epoch locking.
Advantages
- Prevents common configuration errors by enforcing dependency-aware resource creation.
- Ensures compliance with service-specific constraints and security policies.
- Reduces troubleshooting time by providing structured, service-specific diagnostic paths.
- Promotes architectural best practices for resilience and cost efficiency.
- Standardizes the approach to complex media tasks like ad insertion and CDN integration.
Usage examples
- “I need to set up a live event workflow using MediaConnect, MediaLive, and MediaPackage. What is the correct order?”
- The agent will load the core rules, the live event workflow file, and the relevant service rules, then guide you through the dependency-ordered creation process starting with VPC/IAM, followed by MediaPackage, MediaConnect, and finally MediaLive.
- “My MediaLive channel is failing to start and showing pipeline errors. How do I fix it?”
- The agent will load the core rules and the MediaLive troubleshooting file, then prompt you to check specific pipeline failover settings and encoder configurations based on the loaded rules.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/aws/aws-media-services/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip aws-media-services.zip -d .agents/skills
Documentation by AWS
AWS Media Services
Use this skill when the user is doing ANY of the following with AWS media services:
Building or modifying a video workflow (ingest, encoding, packaging, ad insertion, CDN delivery)
Reviewing, evaluating, or auditing an existing or proposed configuration for best practices, compliance, or correctness
Troubleshooting errors, alerts, or unexpected behavior
Asking questions about service constraints, compatibility rules, encoder settings, IAM policies, security groups, DRM, SCTE-35, caching, scaling, or any other AWS media topic
Planning a new workflow and needs to understand requirements, dependencies, or the discovery checklist
Optimizing cost, resilience, or performance of an existing workflow
If the user mentions ANY AWS media service by name (MediaConnect, MediaLive, MediaConvert, MediaPackage, MediaTailor) or related concepts (HLS, DASH, CMAF, ABR ladder, SCTE-35, epoch locking, origin shield, CDI, SRT, RTMP, transcode, live streaming, VOD pipeline, ad insertion, SSAI), load this skill.
This file is the orchestrator. It tells you which reference files to load based on the user's task. Do not load all files at once. Load on demand per the routing table below.
MANDATORY FIRST STEP — Read Before Doing Anything Else
STOP. Before you make ANY API call, pull ANY resource configuration, write ANY code, or produce ANY recommendation, you MUST load the required rule files into context. No exceptions. This applies to every task type: building, modifying, evaluating, troubleshooting, or answering questions.
The rule content is split across:
references/service-rules-core.md— cross-service compatibility constraints, common agent mistakes, and security considerations. ALWAYS loaded.references/service-rules-encoding.md— shared encoder settings (QVBR, GOP, profiles, quality tuning, deinterlacing). Loaded for any encoding task.references/service-rules-mediaconnect.mdreferences/service-rules-medialive.mdreferences/service-rules-mediaconvert.mdreferences/service-rules-mediapackage.mdreferences/service-rules-mediatailor.mdreferences/service-rules-cloudfront.md
Per-service rule files are loaded conditionally based on which services the query involves. Without the relevant rules loaded, you will produce recommendations based on general knowledge that may contradict the documented rules, flag correct configurations as problems, or miss critical constraints entirely.
Sequence (every time):
Read
references/service-rules-core.md— confirm it is in context before proceeding. ALWAYS required.Determine the task type and consult the Task Routing tables below to identify both the workflow/troubleshooting file AND the per-service rules to co-load.
For ad-hoc questions that don't match a workflow or troubleshooting category: if the user names specific service(s), load those service rule files. If the question is symptom-based or you cannot determine which services are involved, load ALL per-service rule files.
Only then begin resource discovery, API calls, or implementation.
If you find yourself about to call aws medialive describe-channel or similar
and you have NOT yet read the core rules file plus the relevant per-service
rules, stop and go back to step 1.
Task Routing
Building or modifying a workflow
Determine the workflow type. Load the matching workflow file AND the per-service rules listed in the right column (the core rules file is already loaded from the mandatory first step above).
| Workflow type | Workflow file | Service rules to co-load |
|---|---|---|
| Live event (ingest → encode → package → deliver) | references/workflow-live-event.md | mediaconnect + medialive + encoding + mediapackage + cloudfront (+ mediatailor if ads) |
| Linear channel (24/7 with schedule, ad insertion) | references/workflow-linear-channel.md | medialive + encoding + mediapackage + mediatailor + cloudfront |
| VOD pipeline (file-based transcode → package → deliver) | references/workflow-vod-pipeline.md | mediaconvert + encoding + mediapackage + cloudfront |
| Live-to-VOD (live + archive/harvest → VOD transcode) | references/workflow-live-event.md + references/workflow-vod-pipeline.md | union of live event + VOD pipeline |
| Ad insertion (SSAI/CSAI, MediaTailor scaling) | references/workflow-ad-insertion.md | medialive + encoding + mediapackage + mediatailor + cloudfront |
| Contribution transport (MediaConnect, SRT, DX, encoders) | references/workflow-contribution-distribution.md | mediaconnect + medialive + encoding |
| Router-based switching (master control, dynamic routing, playout) | references/workflow-contribution-distribution.md | mediaconnect + medialive + encoding |
| Resilience (dual-AZ, dual-region, epoch locking, multi-CDN, ops readiness) | references/workflow-resilience-patterns.md | ALL (cross-cutting) |
| Cost optimization (reserved vs on-demand, channel classes, right-sizing) | references/workflow-cost-optimization.md | ALL (cross-cutting) |
| Subtitles and accessibility (captions, multi-language, auto-captioning) | references/workflow-subtitles-accessibility.md | medialive + mediaconvert + encoding |
Troubleshooting
Load the relevant troubleshooting file(s) for the problem area AND the per-service rules listed in the right column. The core rules file is already loaded from the mandatory first step above. Load only the files needed.
| Problem area | Troubleshooting file | Service rules to co-load |
|---|---|---|
| MediaConnect flow issues, source connectivity, VPC interfaces, MediaConnect Router | references/troubleshooting-mediaconnect.md | mediaconnect |
| MediaLive channel errors, alerts, encoding, pipeline failover | references/troubleshooting-medialive.md | medialive + encoding |
| MediaPackage ingest failures, manifest issues, access denied, v1→v2 migration | references/troubleshooting-mediapackage.md | mediapackage |
| MediaConvert job failures, codec errors, output issues, automation | references/troubleshooting-mediaconvert.md | mediaconvert + encoding |
| MediaTailor ad insertion, ADS issues, SSAI scaling, session management | references/troubleshooting-mediatailor.md | mediatailor + medialive + mediapackage + cloudfront |
| CloudFront origin errors, cache behavior, multi-CDN, Embedded POPs (ePOP) | references/troubleshooting-cloudfront.md | cloudfront + mediapackage |
| Cross-service signal chain (no video, latency, sync, AZ alignment, IAM, failover) | references/troubleshooting-pipeline.md | ALL |
Quick reference
For a quick answer about a specific service's constraints, valid parameter values, or compatibility rules:
references/service-rules-core.mdis already loaded (mandatory first step).If the user names specific service(s) in the query, load those per-service rule files (e.g.
references/service-rules-medialive.md).If the question crosses service boundaries (e.g., MediaPackage→MediaTailor compatibility), the cross-service rules are already in
service-rules-core.md.If you can't determine which services are involved, load ALL per-service rule files.
This includes the following topics:
MediaTailor scaling patterns (multi-region, CDN origin shield, prefetch)
MediaConnect Router (paired resilient zonal endpoints) and downstream NDI converter caveats
Epoch locking and cross-region failover
Contribution transport (SRT tuning, Direct Connect sizing, RTP+FEC)
Multi-CDN architecture patterns
CloudFront advanced patterns (Embedded POPs / ePOP, CF Functions, segment sharding)
Operational readiness for live events (capacity planning, KPI baselines)
DRM production patterns and MediaPackage v1→v2 migration
Audio, HDR, and codec configuration details
Workflow Discovery Checklist
Before creating ANY resources for a new workflow, gather requirements from the user in a fixed order (mode → cost/scale → approach → source → network → encoding → ad insertion → packaging → IAM → VOD-specific). Do not proceed until all required items are answered; later questions depend on earlier answers.
Load references/workflow-discovery-checklist.md for the full ordered question
set whenever building or modifying a workflow.
Plan Validation (before presenting to user)
Before presenting a proposed configuration to the user, cross-check against the loaded service rules:
Codec/container compatibility (e.g., HEVC requires fMP4, not TS)
GOP/segment duration alignment across all ABR rungs
Dependency ordering (downstream before upstream)
IAM trust policy includes all required service principals + sts:TagSession
IAM permissions scoped to specific resource ARNs (no Resource: "*")
Security posture (CIDR scoped, OAC configured, no Principal: *)
All prerequisite resources included (IAM roles, VPC, MediaPackage channel MUST be in the plan before resources that depend on them)
Do NOT make API calls during this step. This is a rules-based review of the proposed plan against constraints already in context.
Agents MUST NOT skip dependency steps to save time. All prerequisites (IAM, VPC, MediaPackage channel, etc.) MUST be created before resources that reference them. Skipping steps and fixing errors reactively leads to circular troubleshooting loops. Execute the plan in dependency order.
Resource Creation Order
Respect dependency order — a resource must exist before anything that references it (live chain, VOD chain, live-to-VOD addition, and the common flow patterns table).
Load references/resource-creation-order.md for the full dependency chains and
flow-pattern table when creating resources.
Startup and Shutdown (Live Only)
Start upstream first and poll each resource to its ready state before proceeding
(STARTING ≠ running); shut down in reverse (STOPPING ≠ stopped). Poll on a
tight ~5s cadence.
Load references/startup-shutdown.md for the ordered start/stop tables and the
polling pattern (including MediaConnect Router lifecycle) when operating a live
workflow.
Tooling
When available, the AWS MCP Server is recommended for sandboxed execution and audit logging:
AWS MCP Server (
aws-mcp-server): AWS API access, Agent SOPs for guided multi-step workflows, and documentation search viasearch_documentationandread_documentation.AWS IaC MCP Server (
aws-iac-mcp-server): CloudFormation template validation, CDK documentation search, CDK code samples, and IaC best practices.
Large response warning: MediaLive describe-channel and MediaPackage list-*
calls return very large JSON. Always use --query (JMESPath) to extract only the
fields you need.
# Good — extract only what you need
aws medialive describe-channel --channel-id 12345 --query "{State:State,Name:Name,Id:Id}"
aws medialive list-channels --query "Channels[].{Name:Name,Id:Id,State:State}"
aws mediapackagev2 list-origin-endpoints --channel-group-name X --channel-name Y \
--query "Items[].{Name:OriginEndpointName,Url:HlsManifests[0].Url}"Files
- ATTRIBUTION.mdAdded by AutoGineer930 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md11.6 KiB
- references/resource-creation-order.md2.3 KiB
- references/service-rules-cloudfront.md9.6 KiB
- references/service-rules-core.md16.6 KiB
- references/service-rules-encoding.md6.3 KiB
- references/service-rules-mediaconnect.md11.3 KiB
- references/service-rules-mediaconvert.md1.3 KiB
- references/service-rules-medialive.md9.4 KiB
- references/service-rules-mediapackage.md6.6 KiB
- references/service-rules-mediatailor.md20.6 KiB
- references/startup-shutdown.md2.2 KiB
- references/troubleshooting-cloudfront.md4.9 KiB
- references/troubleshooting-mediaconnect.md4.7 KiB
- references/troubleshooting-mediaconvert.md4.3 KiB
- references/troubleshooting-medialive.md5.7 KiB
- references/troubleshooting-mediapackage.md5.7 KiB
- references/troubleshooting-mediatailor.md22.2 KiB
- references/troubleshooting-pipeline.md6.2 KiB
- references/workflow-ad-insertion.md7.9 KiB
- references/workflow-contribution-distribution.md12.7 KiB
- references/workflow-cost-optimization.md13.8 KiB
- references/workflow-discovery-checklist.md4.4 KiB
- references/workflow-linear-channel.md4.7 KiB
- references/workflow-live-event.md20.1 KiB
- references/workflow-resilience-patterns.md5.6 KiB
- references/workflow-subtitles-accessibility.md3.4 KiB
- references/workflow-vod-pipeline.md5.4 KiB
references/service-rules-mediatailor.md
Loaded conditionally when the task involves MediaTailor. The cross-service rules in service-rules-core.md are always loaded alongside this file.
Rules here are derived from the public MediaTailor documentation and from behaviour measured against the live service. Where the two disagree, the measured behaviour is marked and wins.
Table of Contents
Mutating a playback configuration
Playback configuration fields
How a session starts, and why it sets the reporting mode
Ad markers in the output manifest
CDN surfaces
Creative conditioning
Prefetch
SCTE-35 dependency
Scaling for large events
Metrics that do not mean what they look like
Quotas
Mutating a playback configuration
This is the single most damaging MediaTailor mistake an agent can make, so it comes first.
PutPlaybackConfiguration is the only mutator. There is no Create, no Update, and no patch semantics. It replaces the whole object, so agents MUST assume that any optional setting absent from the request reverts to its default. Omission semantics are not documented field by field, and measurement shows they are not uniform, so the safe assumption is the only workable one.
Agents MUST read the current configuration with
GetPlaybackConfiguration, merge the change into the full response, strip the response-only fields, and write the whole object back.Agents MUST NOT send a partial
PutPlaybackConfigurationrequest, even to change one field.Agents MUST capture the pre-change
GetPlaybackConfigurationoutput before writing. There is no configuration version history and no rollback API, so that output is the only rollback artifact the customer controls. CloudTrail records therequestParametersof each call, which for a whole-object write is usually a complete configuration, but it captures what was sent rather than what was in effect, so agents MUST NOT treat it as a guaranteed rollback source.Agents MUST verify a configuration change with a brand-new session, never by reloading an existing player. Whether a change reaches sessions already in flight is not documented.
Measured: a request carrying only Name, VideoContentSourceUrl and AdDecisionServerUrl silently cleared SlateAdUrl, PersonalizationThresholdSeconds, AvailSuppression, Bumper, CdnConfiguration, ConfigurationAliases, LivePreRollConfiguration, InsertionMode, AdConditioningConfiguration and DashConfiguration.MpdLocation. Tags survived, and so did ManifestProcessingRules.AdMarkerPassthrough.Enabled, reproducibly. The reset set is not uniform, so agents MUST NOT reason about which fields persist.
Response-only fields that Get returns and the Put request does not accept, and which MUST be stripped before the write: PlaybackConfigurationArn, PlaybackEndpointPrefix, SessionInitializationEndpointPrefix, DualStackPlaybackEndpointPrefix, DualStackSessionInitializationEndpointPrefix, HlsConfiguration, LogConfiguration. DashConfiguration MUST be narrowed to MpdLocation and OriginManifestType, because the request type carries only those two, which also drops the response-only DualStackManifestEndpointPrefix nested inside it.
The two dual-stack prefixes are easy to miss because they appear only on dual-stack-enabled configurations. A strip list that omits them passes on one configuration and fails validation on the next.
IF changing any playback configuration field:
→ Get the current configuration in full
→ Merge the change into that object
→ Strip the response-only fields listed above
→ Put the whole object
→ Get again and diff against the pre-change output
IF a field you did not touch changed:
→ CAUSE: a field was dropped from the request and reverted to its default
→ FIX: restore from the pre-change output, then re-apply the change as a mergeAgents SHOULD treat every PutPlaybackConfiguration call as a whole-object write in reviews and in
generated code, and SHOULD reject a proposed change that constructs the request from scratch.
Playback configuration fields
A playback configuration needs two URLs to do anything: where the content comes from, and where the ads come from. Only Name is marked Required: Yes on the API. Both URLs are Required: No, which means the service accepts a configuration that can never serve an ad. Agents MUST treat both as functionally mandatory and MUST NOT rely on the API to reject a configuration missing either.
VideoContentSourceUrlis the origin manifest URL prefix minus the asset id. Commonly a MediaPackage v2 origin endpoint, but any public HLS or DASH origin reachable on port 80 or 443 with a certificate from a well-known CA qualifies. Agents MUST NOT flag a non-MediaPackage origin as a misconfiguration.AdDecisionServerUrlis the ad decision server. Without it there is no ad decision and therefore no ad insertion, so it is the field to check first when a configuration produces no ads at all. It is a template:[session.*],[avail.*],[scte.*]and[player_params.*]macros are substituted per request. Square brackets only;${session.id}is NOT substituted. A static VAST URL is valid here for testing.The ADS response MUST be VAST through 4.3, VMAP 1.0, or VPAID 2.0. Some VAST 4.0-and-later features are not supported.
TrackingEventsMUST use IAB-compliant standard event types: a non-standard tracking event makes MediaTailor reject the whole VAST response and fill no ad for that avail.Because
PutPlaybackConfigurationreplaces the whole object, a partial write can silently clearAdDecisionServerUrland the API will not stop it. The configuration then serves unpersonalized content with no error, which is the worst failure mode in this service: the stream keeps playing and the revenue stops.CdnConfiguration(content and ad segment prefixes) is OPTIONAL. Without it MediaTailor emits origin-direct segment URLs, which works but bypasses CDN caching.SlateAdUrlis OPTIONAL for non-VPAID workflows and mandatory for VPAID. Slate is live and live-to-VOD only. Without a slate, MediaTailor falls back to the underlying content stream in every situation where it would have shown slate: unfilled break time, an empty VAST or VMAP response, an ADS timeout or 5xx, and a creative that has not finished conditioning.PersonalizationThresholdSecondscaps underfilled ad time. Past the cap, MediaTailor abandons personalization of the break and shows the underlying content, so it works with or without a slate. It applies to ad replacement, not ad insertion, because it relies on there being underlying content to fall back to.InsertionModedefaults toSTITCHED_ONLY.PLAYER_SELECTonly permits server-guided insertion; each session still has to ask for it, and a session that does not ask gets stitched output with no error.Agents MUST NOT read defaults from
aws mediatailor put-playback-configuration --generate-cli-skeleton. The skeleton emits the first enum value, which for at least two fields is the opposite of the real default. Agents SHOULD use the skeleton only to check whether the installed CLI build carries a field at all, because the CLI ships its own API model and lags the service.
How a session starts, and why it sets the reporting mode
Ad stitching happens only inside a MediaTailor session, and the player's first request creates one. There are three entry points:
| Entry point | Protocol | Session id |
|---|---|---|
GET /v1/master/<hash>/<config>/<asset>.m3u8 | HLS, implicit | none needed |
GET /v1/dash/<hash>/<config>/<asset>.mpd | DASH, implicit | returned via redirect carrying ?aws.sessionId= |
POST /v1/session/<hash>/<config>/<asset> with a JSON body | either, explicit | returned in the response body |
The implicit HLS path needs no session id and DOES stitch ads. MediaTailor returns a personalized multivariant playlist whose variant URIs point at a per-session media playlist under
/v1/manifest/<hash>/<config>/<sessionId>/<n>.m3u8. Ad segments appear there, never in the multivariant playlist.aws.sessionIdis the DASH session identifier and the resume form of an explicit init. It is NOT a precondition for HLS stitching. Agents MUST NOT tell a customer that/v1/masterwithoutaws.sessionIdfails to stitch.POSTreturnsmanifestUrlandtrackingUrlas paths, not absolute URLs. Agents MUST resolve them against the scheme and host ofPlaybackEndpointPrefixbefore handing either to a player.The entry point sets the default reporting mode. Implicit
GETdefaults to server-side reporting; explicitPOSTdefaults to client-side. Agents MUST NOT migrate a working player from implicitGETtoPOST /v1/sessionwithout also confirming who fires the beacons: on client-side, MediaTailor stops firing them, impressions fall to zero, and nothing errors.The manifest-parameter prefix differs by entry point:
manifest.<name>on implicit init,manifestParamsin the explicit POST body,manifestParams.<name>on explicit GET.
Ad markers in the output manifest
ManifestProcessingRules.AdMarkerPassthrough.Enabledis HLS only (ManifestProcessingRuleshas no DASH equivalent) and defaults tofalse.It gates
EXT-X-CUE-OUT,EXT-X-CUE-INandEXT-X-SPLICEPOINT-SCTE35only.EXT-X-DATERANGEis passed through regardless of the setting, andEXT-X-DISCONTINUITYis added at the break boundaries either way.EXT-X-CUE-OUT-CONTis never forwarded.MediaTailor applies no logic to the passed-through values. Measured: a 30 s break filled by one 15 s creative still emits
#EXT-X-CUE-OUT:30.000. It is a break-boundary signal, so agents MUST NOT treat a passed-through duration as a fill-rate or impression source.SHOULD be enabled when downstream players or analytics need to see the original ad break boundaries.
[avail.source_content_time_epoch_ms]derives from theEXT-X-PROGRAM-DATE-TIMEof the origin segment that opened the avail, so the macro has no value on an HLS origin without PDT. The HLS specification separately requires a Media Playlist carryingEXT-X-DATERANGEto carryEXT-X-PROGRAM-DATE-TIME. On VOD, MediaTailor adds PDT itself and preserves origin PDT where present.
CDN surfaces
Constructing the distribution belongs to service-rules-cloudfront.md. What matters here is that MediaTailor serves three different kinds of response and they need opposite cache treatment.
| Surface | Path | Cacheable | Forward |
|---|---|---|---|
| Personalized manifests, session init, tracking | /v1/* | NO | all viewer headers and query strings |
| Server-side reporting redirect | /segment/* | NO | all viewer headers and query strings |
| Ad segments | /tm/* | YES, 24h+ | nothing |
| Server-guided interstitial media | /v1/i-media/* | YES, unless guided prefetch is in use | nothing |
Agents MUST set
TTL=0on the manifest, session and/segment/*behaviours, and MUST forward all query strings andUser-Agentthere so targeting variables and device information reach the ad decision server. A shared cache entry on any of them leaks one viewer's session to another./segment/*is the server-side reporting redirect, not an ad segment. It MUST reach MediaTailor on every view for the beacon to fire, so agents MUST NOT apply the ad segment caching rules to it.Agents MUST NOT forward query strings, headers or cookies on the
/tm/*ad segment behaviour: ad segments are identical for every viewer, so forwarding gives each viewer a private cache entry and raises both CDN cost and ad delivery out with no change in behaviour./v1/i-media/*MUST NOT be cached when guided prefetch is in use. The player's refresh of each interstitial media manifest is the prefetch heartbeat, so a cache hit means the request never reaches MediaTailor and no prefetch is enqueued. Nothing errors: prefetch just stops happening. Without guided prefetch the same path is shared and caches like a segment.Every MediaTailor behaviour SHOULD carry a CORS response headers policy. Missing CORS headers on the ad segment behaviour breaks playback in browser-based players.
Compression SHOULD stay enabled on the manifest behaviours. Agents MUST NOT recommend disabling it as a general measure: manifests are the highest-request-rate text in the workflow, so compression there is a material delivery cost saving.
Content segments never traverse MediaTailor, so caching them reduces origin and CDN cost, not MediaTailor cost.
Creative conditioning
The first sighting of a creative is skipped by design, while MediaTailor conditions it to the content's renditions. Agents MUST NOT report a first-sighting skip as a defect. Diagnosis is in
troubleshooting-mediatailor.md.Creatives do NOT have to match the content's bitrate, frame rate or resolution. That is what conditioning does.
MediaTailor conditions the highest-bitrate
MediaFileonly, with no fallback to a lower one, so that entry is the only one whose reachability and format matter.MediaTailor recognises a conditioned creative by three things together: the creative id, the AWS account id, and the transcode variant set, meaning the playback renditions of the underlying content. Change any of them and it is a new variant that must be conditioned again. So a creative warm on one playback configuration is warm on another only where the rendition ladder matches, and agents MUST NOT promise account-wide warmth across configurations with different ladders.
A bitrate that fails to match after rounding to the nearest 8,000 bits counts as a different variant, which is why an encoder ladder change can produce a wave of first-sighting skips on creatives that were already warm.
The index key is the
idon<Creative>. Agents MUST advise a unique id per creative: MediaTailor serves stored content for a known id, so a reused id plays the older ad silently.
Prefetch
Prefetch is NOT enabled by default and MUST be configured explicitly.
Two mechanisms exist and they share no configuration surface. Schedule-based prefetch (
CreatePrefetchSchedule) serves stitched sessions. Guided prefetch (aws.guidedPrefetchMode=MANIFESTon the session) serves server-guided sessions.Agents MUST NOT create a prefetch schedule for a guided session. The API accepts it, it never fires, and no error or log event is raised.
Retrieval is free; insertion bills on consumption; transcoding is charged for prefetched creatives.
SCTE-35 dependency
MediaTailor consumes markers, it does not create them. Markers MUST flow through the whole chain: source encoder to MediaLive to MediaPackage to MediaTailor. See service-rules-medialive.md and service-rules-mediapackage.md for the upstream configuration, and troubleshooting-mediatailor.md for the diagnostic order.
On live, every EXT-X-CUE-OUT needs either a duration or a matching EXT-X-CUE-IN. A break that never closes has two possible layers: the packager never closed it (mismatched segmentation_event_id, an MediaPackage v2 concern), or MediaTailor could not time it.
Scaling for large events
SSAI manifests are personalized per session by design. There is no mode that coalesces viewers onto a shared manifest, so agents MUST NOT propose one. Scale the session count.
Audience-specific content is a different feature: Channel Assembly Program Rules, where an audience cohort selects alternate media on a STANDARD tier LINEAR channel. Agents MUST NOT describe it as an SSAI scaling mode.
Events above 500,000 concurrent viewers require a Support engagement: contact AWS Support at least two weeks ahead so capacity is in place for ad personalization. Agents MUST raise this before any architectural suggestion, because no amount of CDN design substitutes for the capacity request. Request quota increases through the Service Quotas console in the same window.
Origin manifest fetches do NOT scale one-to-one with player requests, because MediaTailor holds a fetched origin manifest and serves it to more than one session.
Origin.AgeandGetManifest.MediaTailorAgesplit the resulting staleness between origin-held and MediaTailor-held time. Agents MUST NOT compute a reuse ratio fromSampleCountofOrigin.AgeagainstRequests:Requestsis concurrent transactions per second across all request types, so the two are not comparable. CompareOrigin.AgeSampleCountagainst the content origin's own access logs instead.Anything that makes the origin URL unique per request (a per-session token, a rotating signature, CDN auth in the URL) defeats that reuse. Protecting a MediaPackage v2 origin with SigV4 avoids the trade-off: grant
mediatailor.amazonaws.comprincipal access plusmediapackagev2:GetObjecton the endpoint policy, and authentication rides in the signature rather than the URL, so the origin stays protected and the URL stays stable. Themediatailor.amazonaws.comservice-principal grant is a cross-service confused-deputy surface, so agents MUST scope it withaws:SourceAccount(your account id) and SHOULD further scope it withaws:SourceArn(the specific playback-configuration ARN) in the endpoint-policy condition block, so only your MediaTailor configurations can exercise the grant.No documented setting reduces origin fetches beyond that reuse. Agents MUST NOT invent one, and MUST NOT offer CDN Origin Shield as the remedy: Origin Shield on the MediaTailor origin reduces the requests reaching MediaTailor from CloudFront edges, which is the opposite direction. Where an origin RPS limit binds, the lever is a quota increase.
Pipeline locking on MediaLive matches segment numbers across pipelines and SHOULD be enabled for failover-sensitive SSAI. It is not required for SSAI to function.
Metrics that do not mean what they look like
Definitions for the documented metrics are in the CloudWatch metrics reference. These are the ones that mislead:
| Metric | What it is not | What it is |
|---|---|---|
Avail.FillRate | percent of breaks that got an ad | the planned simple average of per-avail fill percentages, unweighted by avail duration, and capped at 100%. A 30 s break with one 15 s ad contributes 50%. Two avails filled 50% and 75% report 62.5%, whatever their durations. For a duration-weighted rate use metric math 100*m1/m2 with Avail.FilledDuration Sum as m1 and Avail.Duration Sum as m2 |
Avail.Duration, Avail.FilledDuration | delivered ad time | planned values. The measured equivalents are the Avail.Observed* family |
AdsBilled | impressions | insertions. Use Avail.Impression for beacons, and sum(Avail.Complete)/sum(Avail.Impression) for completion rate |
Avail.Impression | ads viewers saw | ads for which MediaTailor fired a beacon during server-side reporting. A client-side configuration reports zero here while delivering normally |
Origin.* | origin health | emitted only when the response came from the origin itself. Origin.Age is not emitted when the response came from a CDN, so a CDN in front of the origin blinds this metric and 0 errors is not evidence of a healthy origin |
SkippedReason.PersonalizationThresholdExceeded | a count | a duration. It never matches a log count of skipped ads; the other ten SkippedReason.* metrics are counts |
Agents MUST NOT alarm on a metric name absent from a reference table. ResponseTime, AdDecisionServer.Ads.Skipped and Avail.SlateOnly appear in User Guide prose, are defined in no metric table, and do not exist. Note that the metrics page is not the complete inventory: the six AdDecisionServer.Overlay* metrics are real and documented on the overlay ads page instead.
Quotas
Agents MUST verify a current quota through the Service Quotas API before relying on a limit, rather than restating a number. Two worth knowing about because the failure is silent or confusing:
The ad decision server request timeout is configurable (
AdsPersonalizationTimeouts.AdsRequestTimeoutMilliseconds, default 3000). The quotas page still describes it as a fixed, non-adjustable 3 seconds; that is stale.ListPrefetchSchedulesdocumentsMaxResultsas 1 to 100. Observed inaws-cli/2.34.63, a value of 51 was rejected by client-side validation. Agents SHOULD verify against the installed CLI version rather than treating either bound as fixed.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs a command-line tool
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS
- Publisher
- AWS (Official)
- Source
- aws/agent-toolkit-for-aws · skills/specialized-skills/media-services-skills/aws-media-services · commit 0a218f8
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download aws-media-services.zip