Media CDN offers content delivery, cache off-load, origin shielding, request authorization and integration with Google Cloud external Application Load Balancers, Logging, and Monitoring platforms.
Media CDN provides several REST API resources:
EdgeCacheService
, responsible for client-facing configuration (TLS, IP addressing), routing, CDN configuration (cache modes, TTLs, signing), and security policies.EdgeCacheOrigin
, responsible for per-origin configuration for any HTTP-based origin, as well as retry conditions when content is not available or reachable. For example, as part of a redundant video packager configuration.- (Optional)
EdgeCacheKeyset
, which contains a set of public keys used for validating that client requests were signed by your infrastructure / CMS.EdgeCacheKeysets
are associated with anEdgeCacheService
, and can be used across multiple services.
These resources are represented in the following example, which shows the
EdgeCacheService
terminating traffic, and routing to different
EdgeCacheOrigins
.
Permissions
You must have the Identity and Access Management permissions required to create Media CDN resources. Media CDN has the following predefined IAM roles:
roles/networkservices.edgeCacheAdmin
roles/networkservices.edgeCacheUser
roles/networkservices.edgeCacheViewer
Enable the required services
To configure and deploy Media CDN services, you need to enable both the Network Services API and the Certificate Manager API for your project.
Console
Enable the Network Services API.
Enable the Certificate Manager API.
gcloud
Enable the Network Services API:
gcloud services enable networkservices.googleapis.com
Enable the Certificate Manager API:
gcloud services enable certificatemanager.googleapis.com
For more information about enabling and disabling services, see the Service Usage documentation.
Example configuration
The following list of resources describes a representative Media CDN configuration:
An
EdgeCacheOrigin
:- A Cloud Storage-based origin that retries cache fetches against an alternative origin (AWS S3) if the object isn't in Cloud Storage (for example, HTTP 404) or a 5xx error is encountered.
One
EdgeCacheKeyset
, which contains:- Two Ed25519 public keys, which are used to validate signed requests.
- In the example configuration, you can rotate keys each month, keeping two keys in production.
One
EdgeCacheService
with two routes, including:- A route for manifests, associated with the Cloud Storage origin, with short cache TTLs.
- A route for video segments, protected by signed requests, and associated with the Cloud Storage origin, configured to cache all responses.
IPv4, IPv6, logging enabled (default), and a managed SSL certificate configured
The following example shows the gcloud
output for this configuration:
gcloud edge-cache origins describe prod-media-origin
id: "2295067926314745283" creationTimestamp: "2019-11-13T09:53:48.757-08:00" name: "prod-media-origin" description: "" originAddress: "gs://bucket_name/" failoverOrigin: "s3-origin" retryConditions: [HTTP_5XX, NOT_FOUND] originProtocol: HTTP2 timeouts: connectTimeout: 5s maxAttemptsTimeout: 10 responseTimeout: 6s
id: "2295067926314745283" creationTimestamp: "2019-11-13T09:53:48.757-08:00" name: "s3-origin" description: "" originAddress: "media.example.com.s3.amazonaws.com" retryConditions: [HTTP_5XX, NOT_FOUND] originProtocol: HTTP2
gcloud edge-cache keysets describe prod-keyset
id: "2295067926314745283" creationTimestamp: "2019-11-13T09:53:48.757-08:00" name: "prod-keyset" publicKeys: - name: "sept-2020-key" value: "DThVLjhAKm3VYOvLBAwFZ5XbjVyF98Ias8NZU0WEM9w=" - name: "aug-2020-key" value: "3nQa82ScYgDDAxJrKCqumSEg60VNODGR5dGAveJWsw4="
gcloud edge-cache services describe prod-media-service
name: "prod-media-service" edgeSslCertificates: - "media-example-com-cert" - "video-serving-example-com-cert" requireTls: true routing: hostRules: - description: "prod hostnames" hosts: - "media.example.com" - "video-serving.example.net" pathMatcher: "routes" pathMatchers: - name: "routes" routeRules: - priority: 1 description: "prod video segments" origin: "prod-media-origin" matchRules: - pathTemplateMatch: "/**.ts" # HLS segments - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments routeAction: cdnPolicy: cacheMode: "FORCE_CACHE_ALL" clientTtl: 3600s defaultTtl: 86400s signedRequestMode: REQUIRE_SIGNATURES signedRequestKeySet: "prod-keyset" headerAction: responseHeadersToAdd: - headerName: cache-status headerValue: "{cdn_cache_status}" - headerName: proxy-status headerValue: "{proxy_status}" - priority: 2 description: "prod manifest endpoints" origin: "prod-media-origin" matchRules: - pathTemplateMatch: "/**.m3u8" # HLS playlists - pathTemplateMatch: "/**.mpd" # DASH manifests routeAction: urlRewrite: pathPrefixRewrite: "/output/manifests" cdnPolicy: cacheMode: "CACHE_ALL_STATIC" clientTtl: 10s defaultTtl: 30s maxTtl: 120s headerAction: responseHeadersToAdd: - headerName: cache-status headerValue: "{cdn_cache_status}" - headerName: proxy-status headerValue: "{proxy_status}" - priority: 3 # catch all routes should be the lowest priority route description: "catch all route" origin: "prod-media-origin" matchRules: - prefixMatch: / headerAction: responseHeadersToAdd: - headerName: cache-status headerValue: "{cdn_cache_status}" - headerName: proxy-status headerValue: "{proxy_status}"
Configuration options for Media CDN
To configure Media CDN, you can use the following tools:
- Google Cloud console
- Imported YAML or JSON files
- The APIs directly
Use the Google Cloud console
For instructions that describe how to configure Media CDN in the Google Cloud console, see the quickstart.
Import and export configurations
The gcloud CLI lets you export and import configurations from YAML or JSON files, enabling integration with continuous delivery systems or by using infrastructure-as-code tooling. You can duplicate configurations, test an isolated service in a staging environment before updating your production environment, and snapshot configurations into version control.
Output only fields are not imported, and are implicitly excluded when importing a configuration. Specifically:
- IP addresses are not imported, as they are dedicated to each service. Services cannot share IP addresses.
- The
selfLink
of the resource, which is based on the resource name. - The
id
of the resource, which is automatically generated.
To export a service, EdgeCacheOrigin
or EdgeCacheKeyset
, use the export
sub-command for each resource. For example, to export a service configuration:
gcloud edge-cache services export SERVICE_NAME \ --destination=my-service.yaml
Exported [projects/my-project/locations/global/edgeCacheServices/SERVICE_NAME] to 'my-service.yaml'.
Similarly, you can import an existing service configuration, either as a new service or as an update-in-place for an existing service:
gcloud edge-cache services import new-staging-service \ --source=my-service.yaml
Use asynchronous API operations
By default, gcloud
commands that create, update or delete a resource are
blocking, and only return once the task is complete (for both success and
failure). The REST API is asynchronous by default.
In some cases, you might want to make these requests asynchronously. You can
provide the --async
flag, which causes the command to return immediately
with an operation ID. You can use this ID to check and poll to confirm
whether the task succeeded, whether it returned an error, and what the error
message was.
You inspect an individual operation (by its ID) to understand the error in
detail. For example, if you configure a logConfig.sampleRate
without also
setting logConfig.enable = true
, you can expect the following error to be
returned:
gcloud edge-cache operations describe operation-1611525680496-5b9ac8fbb7f58-90a7a822-f0c1e8c6
done: true error: message: "Logs sample rate must not be specified without enabling logging." name: projects/my-project/locations/global/operations/operation-1611525680496-5b9ac8fbb7f58-90a7a822-f0c1e8c6
To view all recent operations, their status, and completion, you can run the following command:
gcloud edge-cache operations list
END_TIME ID TARGET DONE operation-1611095421009-5b9486244bf21-cc6b5924-628b8e2a True operation-1611096056610-5b94888273fe6-2da85286-8c810f8e True operation-1611095551517-5b9486a0c251e-c2e1bbbb-de4aa8a5 True