配置概览

Media 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

  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