媒体 CDN 提供内容分发、缓存分流、来源屏蔽、请求授权,并可与 Google Cloud 外部应用负载平衡器、日志记录和监控平台集成。
Media CDN 提供多个 REST API 资源:
EdgeCacheService
,负责面向客户端的配置(TLS、IP 地址)、路由、CDN 配置(缓存模式、TTL、签名)和安全政策。EdgeCacheOrigin
,负责任何基于 HTTP 的源的每个源配置,以及内容不可用或无法访问时的重试条件。例如,作为冗余视频封装容器配置的一部分。- (可选)
EdgeCacheKeyset
,其中包含一组公钥,用于验证客户端请求是否已由您的基础架构 / CMS 签名。EdgeCacheKeysets
与EdgeCacheService
相关联,可在多个服务中使用。
以下示例展示了这些资源,其中显示了 EdgeCacheService
终止流量并将其路由到不同的 EdgeCacheOrigins
。
权限
您必须具备创建 Media CDN 资源所需的 Identity and Access Management 权限。Media CDN 具有以下预定义 IAM 角色:
roles/networkservices.edgeCacheAdmin
roles/networkservices.edgeCacheUser
roles/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 文档。
配置示例
以下资源列表介绍了典型的媒体 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 控制台中配置 Media 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