配置概览

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

Media CDN 提供多个 REST API 资源:

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

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

一个示例配置,其中包含用于终止流量、使用可选的 `EdgeCacheKeyset` 检查是否有已签名请求,以及将请求路由到三个不同 `EdgeCacheOrigin` 的 `EdgeCacheService`。
一个示例配置,其中包含用于终止流量、使用可选的 EdgeCacheKeyset 检查是否有已签名请求以及将请求路由到三个不同 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 文档

配置示例

以下资源列表介绍了典型的媒体 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 控制台中配置 Media 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