Media CDN 提供内容分发、缓存分流、源站屏蔽、请求授权,并与 Google Cloud外部应用负载平衡器、日志记录和监控平台集成。
Media CDN 提供多个 REST API 资源:
EdgeCacheService,负责面向客户端的配置(TLS、IP 地址)、路由、CDN 配置(缓存模式、TTL、签名)和安全政策。EdgeCacheOrigin,负责任何基于 HTTP 的来源的每个来源配置,以及内容不可用或无法访问时的重试条件。例如,作为冗余视频封装程序配置的一部分。- (可选)
EdgeCacheKeyset,其中包含一组用于验证客户端请求是否由您的基础架构 / CMS 签名的公钥。EdgeCacheKeysets与EdgeCacheService相关联,可用于多项服务。
以下示例展示了这些资源,其中显示了终止流量的 EdgeCacheService,以及路由到不同 EdgeCacheOrigins 的流量。
EdgeCacheService、用于检查已签名请求(带有可选的 EdgeCacheKeyset)的 EdgeCacheService,以及用于将请求路由到三个不同 EdgeCacheOrigins 的 EdgeCacheService。权限
您必须拥有创建 Media CDN 资源所需的 Identity and Access Management 权限。Media CDN 具有以下预定义的 IAM 角色:
roles/networkservices.edgeCacheAdminroles/networkservices.edgeCacheUserroles/networkservices.edgeCacheViewer
启用必需服务
如需配置和部署 Media CDN 服务,您需要为项目同时启用 Network Services API 和 Certificate Manager API。
控制台
gcloud
启用 Network Services API:
gcloud services enable networkservices.googleapis.com启用 Certificate Manager API:
gcloud services enable certificatemanager.googleapis.com
如需详细了解如何启用和停用服务,请参阅Service Usage 文档。
配置示例
以下资源列表描述了一个具有代表性的 Media CDN 配置:
EdgeCacheOrigin:- 一种基于 Cloud Storage 的源站,如果对象不在 Cloud Storage 中(例如,HTTP 404)或遇到 5xx 错误,则会针对备用源站 (AWS S3) 重试缓存提取。
一个
EdgeCacheKeyset,其中包含:- 两个 Ed25519 公钥,用于验证已签名的请求。
- 在示例配置中,您可以每月轮换密钥,并保持两个密钥处于生产状态。
一个
EdgeCacheService,包含两条路线,包括:- 与 Cloud Storage 来源相关联的清单路由,具有较短的缓存 TTL。
- 视频片段的路由,受签名请求保护,与 Cloud Storage 源相关联,配置为缓存所有响应。
IPv4、IPv6、已启用日志记录(默认)且已配置代管式 SSL 证书
以下示例展示了此配置的 gcloud 输出:
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}"
媒体 CDN 的配置选项
如需配置媒体 CDN,您可以使用以下工具:
- Google Cloud 控制台
- 导入的 YAML 或 JSON 文件
- 直接使用 API
使用 Google Cloud 控制台
如需了解如何在Google Cloud 控制台中配置媒体 CDN 的说明,请参阅快速入门。
导入和导出配置
借助 gcloud CLI,您可以从 YAML 或 JSON 文件导出和导入配置,从而与持续交付系统集成或使用基础设施即代码工具。您可以复制配置、在预演环境中测试隔离的服务,然后再更新生产环境,还可以将配置纳入版本控制。
系统不会导入仅限输出的字段,并且在导入配置时会隐式排除这些字段。具体而言:
- IP 地址不会导入,因为它们专用于每个服务。 服务无法共享 IP 地址。
- 资源的
selfLink,基于资源名称。 - 资源的
id,系统会自动生成。
如需导出服务、EdgeCacheOrigin 或 EdgeCacheKeyset,请为每种资源使用 export 子命令。例如,如需导出服务配置,请执行以下操作:
gcloud edge-cache services export SERVICE_NAME \
--destination=my-service.yaml
Exported [projects/my-project/locations/global/edgeCacheServices/SERVICE_NAME] to 'my-service.yaml'.
同样,您可以导入现有服务配置,既可以作为新服务导入,也可以作为现有服务的就地更新导入:
gcloud edge-cache services import new-staging-service \
--source=my-service.yaml
使用异步 API 操作
默认情况下,创建、更新或删除资源的 gcloud 命令是阻塞的,并且仅在任务完成(成功和失败)后返回。REST API 默认是异步的。
在某些情况下,您可能需要异步发出这些请求。您可以提供 --async 标志,这会导致命令立即返回并提供操作 ID。您可以使用此 ID 进行检查和轮询,以确认任务是否成功、是否返回了错误以及错误消息是什么。
您可以检查单个操作(按其 ID)以详细了解错误。例如,如果您配置了 logConfig.sampleRate 但未同时设置 logConfig.enable = true,则系统可能会返回以下错误:
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
如需查看所有近期的操作、其状态和完成情况,您可以运行以下命令:
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