配置概览

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

Media CDN 提供多个 REST API 资源:

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

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

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

权限

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

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

启用必需服务

如需配置和部署 Media CDN 服务,您需要为项目同时启用 Network Services API 和 Certificate 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,系统会自动生成。

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