配置概览

媒体 CDN 提供内容分发、缓存分流、源站防护、请求授权以及与 Google Cloud 外部应用负载平衡器、Logging 和 Monitoring 平台的集成。

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

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

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

以下配置示例:“EdgeCacheService”可终止流量,使用可选的“EdgeCacheKeyset”检查签名请求,并将请求路由到三个不同的“EdgeCacheOrigins”。
具有 EdgeCacheService 的示例配置,可终止流量,检查是否具有可选的 EdgeCacheKeyset 的签名请求,并将请求路由到三个不同的 EdgeCacheOrigins

权限

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

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

启用所需的服务

如需配置和部署媒体 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 控制台中配置媒体 CDN,请参阅quickstart

导入和导出配置

借助 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