配置概览

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

媒体 CDN 提供多种 REST API 资源:

  • EdgeCacheService,负责面向客户端的配置 (TLS、IP 地址)、路由 CDN 配置 (缓存模式、TTL、签名)以及 安全政策
  • EdgeCacheOrigin,负责针对每个源站进行配置 基于 HTTP 的来源,以及内容不是 可用或可访问。例如,作为冗余视频打包器的一部分 配置。
  • (可选)EdgeCacheKeyset,其中包含一组公钥,用于验证客户端请求是否已由您的基础架构/CMS 签名EdgeCacheKeysets已关联 与 EdgeCacheService 相关联,并且可以在多项服务中使用。

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

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

权限

您必须拥有创建所需的 Identity and Access Management 权限 媒体 CDN 资源。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

有关如何配置媒体 CDN 的说明,请参阅 Google Cloud 控制台,请参阅快速入门

导入和导出配置

借助 gcloud CLI,您可以从 YAML 或 JSON 文件,可实现与持续交付系统或 使用infrastructure-as-code 工具。您可以复制配置并在 然后更新生产环境和快照 部署到版本控制系统

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

  • 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