Guía de configuración

Media CDN ofrece entrega de contenido, descarga de caché, protección de origen y autorización de solicitudes, además de integración con las plataformas de balanceo de cargas HTTP, de registro y de supervisión de Google Cloud.

Media CDN proporciona varios recursos de la API de REST:

  • EdgeCacheService, responsable de la configuración orientada al cliente (TLS, direccionamiento IP), enrutamiento, configuración de CDN (modos de almacenamiento en caché, TTL, firma) y políticas de seguridad.
  • EdgeCacheOrigin, responsable de la configuración por origen para cualquier origen basado en HTTP, así como las condiciones de reintento cuando el contenido no está disponible o no se puede acceder Por ejemplo, como parte de una configuración de empaquetado de video redundante.
  • EdgeCacheKeyset, que contiene un conjunto de claves públicas que se usan para validar que las solicitudes de los clientes estén firmadas por tu infraestructura o CMS (opcional). EdgeCacheKeysets están asociados con un EdgeCacheService y se pueden usar en varios servicios.

Estos recursos se representan en el siguiente ejemplo, que muestra el EdgeCacheService en el que finaliza el tráfico y se enruta a diferentes EdgeCacheOrigins.

Configuración de ejemplo con un “EdgeCacheService” que finaliza el tráfico, verifica las solicitudes firmadas con un “EdgeCacheKeyset” opcional y enruta las solicitudes a tres “EdgeCacheSources”.
Una configuración de ejemplo con un EdgeCacheService que finaliza el tráfico, verifica las solicitudes firmadas con un EdgeCacheKeyset opcional y enruta las solicitudes. a tres EdgeCacheOrigins diferentes.

Permisos

Debes tener los permisos de Identity and Access Management necesarios para crear recursos de CDN de Media. Media CDN tiene las siguientes funciones predefinidas de IAM:

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

Habilita los servicios obligatorios

Para configurar e implementar los servicios de Media CDN, debes habilitar la API de servicios de red y la API del Administrador de certificados en tu proyecto.

Console

  1. Habilita la API de servicios de red.

    Habilitar la API

  2. Habilita la API de administrador de certificados.

    Habilitar la API

gcloud

Para habilitar el servicio de API de servicios de red en tu proyecto actual, ejecuta el siguiente comando:

gcloud services enable networkservices.googleapis.com

Para habilitar la API de Management de certificados, ejecuta el siguiente comando:

gcloud services enable certificatemanager.googleapis.com

Para obtener más información sobre cómo habilitar e inhabilitar servicios, consulta la documentación de Service Usage.

Configuración de ejemplo

En la siguiente lista de recursos, se describe una configuración representativa de Media CDN:

  • Un EdgeCacheOrigin:

    • Un origen basado en Cloud Storage que reintenta las recuperaciones de caché en un origen alternativo (AWS S3) si el objeto no está en Cloud Storage (por ejemplo, HTTP 404) o se produce un error 5xx.
  • Un EdgeCacheKeyset, que contiene lo siguiente:

    • Dos claves públicas Ed25519, que se usan para validar solicitudes firmadas
    • En la configuración de ejemplo, puedes rotar las claves cada mes y mantener dos claves en producción.
  • Una EdgeCacheService con dos rutas, incluidas las siguientes:

    • Una ruta para manifiestos, asociada con el origen de Cloud Storage, con TTL cortos de caché.
    • Una ruta para segmentos de video, protegida por solicitudes firmadas y asociada con el origen de Cloud Storage, configurada para almacenar en caché todas las respuestas.
  • IPv4, IPv6, registro habilitado (predeterminado) y un certificado SSL administrado configurado

En el siguiente ejemplo, se muestra el resultado de gcloud para esta configuración:

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: cache-id
          headerValue: "{cdn_cache_id}"
    - 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: cache-id
          headerValue: "{cdn_cache_id}"
    - 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: cache-id
          headerValue: "{cdn_cache_id}"

Opciones de configuración para Media CDN

Para configurar Media CDN, puedes usar las siguientes herramientas:

  • Consola de Google Cloud
  • Archivos YAML o JSON importados
  • Las API directamente

Usa la consola de Google Cloud

Ir a Media CDN

Para obtener instrucciones que describen cómo configurar Media CDN en Google Cloud Console, consulta la guía de inicio rápido.

Importa y exporta parámetros de configuración

La CLI de gcloud te permite exportar e importar configuraciones desde archivos YAML o JSON, lo que permite la integración con sistemas de entrega continua o herramientas de infraestructura como código. Puedes duplicar las configuraciones, probar un servicio aislado en un entorno de etapa de pruebas antes de actualizar el entorno de producción y crear configuraciones de instantáneas en el control de versiones.

Los campos de solo salida no se importan y se excluyen de forma implícita cuando se importa una configuración. En particular, haz lo siguiente:

  • Las direcciones IP no se importan, ya que están dedicadas a cada servicio. Los servicios no pueden compartir direcciones IP.
  • El selfLink del recurso, que se basa en el nombre del recurso.
  • El id del recurso, que se genera de forma automática.

Para exportar un servicio, EdgeCacheOrigin o EdgeCacheKeyset, usa el subcomando export para cada recurso. Por ejemplo, para exportar una configuración de servicio:

gcloud edge-cache services export SERVICE_NAME \
    --destination=my-service.yaml
Exported [projects/my-project/locations/global/edgeCacheServices/SERVICE_NAME] to 'my-service.yaml'.

Del mismo modo, puedes importar una configuración de servicio existente, como un servicio nuevo o como una actualización en el lugar para un servicio existente:

gcloud edge-cache services import new-staging-service \
    --source=my-service.yaml

Usa operaciones de API asíncronas

De forma predeterminada, los comandos gcloud que crean, actualizan o borran un recurso se bloquean y solo se muestran una vez que se completa la tarea (tanto para éxito como para fallas). La API de REST es asíncrona de forma predeterminada.

En algunos casos, es posible que desees realizar estas solicitudes de forma asíncrona. Puedes proporcionar la marca --async, que hace que el comando se muestre de inmediato con un ID de operación. Puedes usar este ID para verificar y sondear si la tarea tuvo éxito, si mostró un error y cuál fue el mensaje de error.

Inspeccionas una operación individual (por su ID) para comprender el error en detalle. Por ejemplo, si configuras un logConfig.sampleRate sin configurar también logConfig.enable = true, es posible que se muestre el siguiente error:

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

Para ver todas las operaciones recientes, su estado y finalización, puedes ejecutar el siguiente comando:

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