配置概览

Media CDN 提供内容分发、缓存分流、源站屏蔽、请求授权,并与 Google Cloud外部应用负载平衡器、日志记录和监控平台集成。

Media CDN 提供多个 REST API 资源:

  • EdgeCacheService,负责面向客户端的配置(TLS、IP 地址)、路由、CDN 配置(缓存模式、TTL、签名)和安全政策
  • EdgeCacheOrigin,负责任何基于 HTTP 的来源的每个来源配置,以及内容不可用或无法访问时的重试条件。例如,作为冗余视频封装程序配置的一部分。
  • (可选)EdgeCacheKeyset,其中包含一组用于验证客户端请求是否由您的基础架构 / CMS 签名的公钥。EdgeCacheKeysetsEdgeCacheService 相关联,可用于多项服务。

以下示例展示了这些资源,其中显示了终止流量的 EdgeCacheService,以及路由到不同 EdgeCacheOrigins 的流量。

一个配置示例,其中包含一个终止流量的 `EdgeCacheService`、一个检查签名请求(使用可选的 `EdgeCacheKeyset`)的 `EdgeCacheService`,以及一个将请求路由到三个不同 `EdgeCacheOrigin` 的 `EdgeCacheService`。
一个配置示例,其中包含用于终止流量的 EdgeCacheService、用于检查已签名请求(带有可选的 EdgeCacheKeyset)的 EdgeCacheService,以及用于将请求路由到三个不同 EdgeCacheOriginsEdgeCacheService

权限

您必须拥有创建 Media CDN 资源所需的 Identity and Access Management 权限。Media CDN 具有以下预定义的 IAM 角色:

  • roles/networkservices.edgeCacheAdmin
  • roles/networkservices.edgeCacheUser
  • roles/networkservices.edgeCacheViewer

启用必需服务

如需配置和部署 Media CDN 服务,您需要为项目同时启用 Network Services APICertificate Manager API

控制台

  1. 启用 Network Services API。

    启用该 API

  2. 启用 Certificate Manager API。

    启用该 API

gcloud

  1. 启用 Network Services API:

    gcloud services enable networkservices.googleapis.com
    
  2. 启用 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 控制台

前往媒体 CDN

如需了解如何在Google Cloud 控制台中配置媒体 CDN 的说明,请参阅快速入门

导入和导出配置

借助 gcloud CLI,您可以从 YAML 或 JSON 文件导出和导入配置,从而与持续交付系统集成或使用基础设施即代码工具。您可以复制配置、在预演环境中测试隔离的服务,然后再更新生产环境,还可以将配置纳入版本控制。

系统不会导入仅限输出的字段,并且在导入配置时会隐式排除这些字段。具体而言:

  • IP 地址不会导入,因为它们专用于每个服务。 服务无法共享 IP 地址。
  • 资源的 selfLink,基于资源名称。
  • 资源的 id,系统会自动生成。

如需导出服务、EdgeCacheOriginEdgeCacheKeyset,请为每种资源使用 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