Configurar el almacenamiento de objetos de terceros

Puedes usar un backend externo cuando el contenido esté alojado en un servidor local o en otra nube. El backend externo te permite servir el contenido desde la CDN de Google Cloud.

En este documento se explica el proceso para configurar un almacenamiento de objetos de terceros, como Amazon Simple Storage Service (Amazon S3) o Azure Blob Storage, como backend externo de Cloud CDN. Los backends externos y Cloud CDN funcionan junto con un balanceador de carga de aplicación externo.

Arquitectura

Para crear el backend externo, crea un grupo de puntos finales de red (NEG) de Internet que apunte al servicio de almacenamiento de terceros como backend del balanceador de carga. Los NEGs de Internet se usan para backends externos.

Para configurar el segmento de almacenamiento de terceros como backend, debe hacer lo siguiente:

  1. Prepara el segmento de almacenamiento de terceros para publicar contenido.
  2. Crea un NEG de Internet que use el FQDN del bucket.
  3. Configura el balanceador de carga de aplicación externo con el NEG de Internet como backend.
  4. Prueba la configuración.

Preparar el contenedor para publicar contenido

Antes de empezar la configuración en Google Cloud, asegúrate de que el contenedor esté configurado correctamente. En estas instrucciones se da por hecho que usas un segmento de Amazon S3 y que tienes los permisos necesarios para hacer cambios en el segmento y los objetos de Amazon S3.

  1. Asegúrate de que el segmento de Amazon S3 y los objetos que contiene sean públicos o de que hayas configurado la autenticación de origen privado para el segmento de Amazon S3.

  2. Asegúrate de que el contenido cumpla los requisitos de almacenamiento en caché que se indican en Contenido que se puede almacenar en caché. Si necesitas añadir metadatos de objetos, consulta la base de conocimientos de AWS. Por ejemplo, puedes consultar el artículo Editar metadatos de objetos.

  3. Necesitará el endpoint del contenedor de Amazon S3 (el FQDN) cuando configure el NEG de Internet. Para obtener la información del endpoint, sigue las instrucciones que se indican en la base de conocimientos de AWS. Por ejemplo, consulta el artículo sobre cómo acceder a un bucket. También puede obtener la URL del endpoint de Amazon S3 desde la página de resumen del objeto.

Crear un NEG de Internet que use el nombre de host del segmento

Para simplificar, en este ejemplo se usa el FQDN backend.example.com. Asegúrate de sustituirlo por el nombre de dominio completo del segmento de almacenamiento de terceros, que podría ser algo parecido a http://unique-name-bucket.s3-us-west-1.amazonaws.com/.

En esta guía se usa un ejemplo para describir los conceptos básicos del uso de un backend externo (a veces denominado origen personalizado) en un balanceador de carga de aplicación externo. Un backend externo es un endpoint que es externo a Google Cloud. Si usas un backend externo con un balanceador de carga de aplicación externo, puedes mejorar el rendimiento usando el almacenamiento en caché de Cloud CDN.

En la guía se explica cómo configurar un balanceador de carga de aplicación externo global con un servicio de backend habilitado para Cloud CDN que actúa como proxy de un servidor de backend externo en backend.example.com.

En el ejemplo, el balanceador de carga acepta solicitudes HTTPS de los clientes y las proxyiza como HTTPS al backend externo. En este ejemplo se da por supuesto que el backend externo admite HTTPS.

Otra opción sería configurar un balanceador de carga para que acepte solicitudes HTTP o HTTPS y usar HTTPS al proxyizar solicitudes al backend externo.

En esta guía se da por hecho que ya ha configurado un balanceador de carga y que va a añadir un nuevo backend externo. Para obtener más información, consulta Configurar un balanceador de carga de aplicaciones clásico con un backend de grupo de instancias gestionado.

En la figura 1 se muestra una arquitectura de ejemplo.

Figura 1. Caso práctico de uso de un segmento de S3 para backends externos.
Imagen 1. Caso práctico de uso de un segmento de S3 para backends externos.

En el diagrama, www.example.com tiene un frontend de balanceador de carga con la dirección IP 120.1.1.1. Cuando se produce un fallo de caché, las solicitudes de los usuarios de /cart/id/1223515 se obtienen del backend externo mediante HTTPS. Todo el resto del tráfico entrante se dirige al Google Cloud servicio de backend con VMs de Compute Engine o al backend bucket, en función del mapa de URLs.

Antes de empezar

Antes de seguir esta guía, familiarízate con lo siguiente:

Permisos

Para seguir esta guía, debe crear un grupo de puntos finales de red (NEG) de Internet y crear o modificar un balanceador de carga de aplicaciones externo en un proyecto. Debes ser propietario o editor del proyecto, o bien tener los dos roles de gestión de identidades y accesos de Compute Engine siguientes.

Tarea Rol necesario
Crear y modificar componentes de balanceadores de carga Administrador de red
Crear y modificar grupos de puntos de conexión de red Administrador de instancias de Compute

Configurar un balanceador de carga con un backend externo

En esta sección se explica cómo configurar y probar un NEG de Internet.

Descripción general de la configuración

Para configurar una NEG de Internet, debes hacer lo siguiente:

  • Definir el endpoint de Internet en un NEG de Internet.
  • Añadir un NEG de Internet como backend a un servicio de backend.
  • Definir qué tráfico de usuarios se asignará a este servicio de backend configurando el mapa de URLs de tu balanceador de carga de aplicación externo.
  • Incluir en la lista de permitidas los intervalos de IP necesarios.

En este ejemplo se crean los siguientes recursos:

  • Una regla de reenvío con la dirección IP 120.1.1.1 dirige las solicitudes entrantes a un proxy de destino.
    • El networkTier de la regla de reenvío debe ser PREMIUM.
  • El proxy de destino comprueba cada solicitud con el mapa de URLs para determinar el servicio backend adecuado para la solicitud.
    • En el caso de los backends externos, el proxy de destino debe ser TargetHttpProxy o TargetHttpsProxy. En este ejemplo se usa TargetHttpsProxy.
  • Si la CDN de Cloud está habilitada (opcional) en el servicio de backend, se pueden almacenar en caché y servir respuestas desde las cachés de Cloud CDN.
  • En este ejemplo se incluye un encabezado personalizado, que es obligatorio cuando el backend externo espera un valor concreto para el encabezado Host de la solicitud HTTP.

La configuración es similar a la siguiente.

Figura 2. Cloud CDN con un backend de segmento de Amazon S3.
Imagen 2. Cloud CDN con un backend de segmento de Amazon S3.

Crear el NEG y el endpoint de Internet

Consola

  1. En la Google Cloud consola, ve a la página Grupos de endpoints de red.

    Ir a grupos de puntos finales de red

  2. Haz clic en Crear grupo de endpoints de red.
  3. Introduce el nombre del grupo de puntos finales de red: example-fqdn-neg.
  4. En Tipo de grupo de puntos finales de red, selecciona Grupo de puntos finales de red (Internet).
  5. En Puerto predeterminado, introduce 443.
  6. En Nuevo endpoint de red, selecciona Nombre de dominio completo y puerto.
  7. En FQDN, introduce backend.example.com.
  8. En Tipo de puerto, selecciona Predeterminado y comprueba que Número de puerto sea 443.
  9. Haz clic en Crear.

gcloud

  1. Crea un NEG de Internet y asigna el valor --network-endpoint-type a internet-fqdn-port (el nombre de host y el puerto en los que se puede acceder a tu backend externo):

    gcloud compute network-endpoint-groups create example-fqdn-neg \
        --network-endpoint-type="internet-fqdn-port" --global
    
  2. Añade tu endpoint al NEG. Si no se especifica ningún puerto, se seleccionará el puerto 80 (HTTP) o 443 (HTTPS; HTTP/2) de forma predeterminada, en función del protocolo configurado en el servicio de backend. Incluye la marca --global:

    gcloud compute network-endpoint-groups update example-fqdn-neg \
        --add-endpoint="fqdn=backend.example.com,port=443" \
        --global
    
  3. Lista la NEG de Internet creada:

    gcloud compute network-endpoint-groups list --global
    

    Resultado:

    NAME                LOCATION   ENDPOINT_TYPE        SIZE
    example-fqdn-neg    global     INTERNET_FQDN_PORT   1
    

  4. Lista el endpoint de ese NEG:

    gcloud compute network-endpoint-groups list-network-endpoints example-fqdn-neg \
        --global
    

    Resultado:

    INSTANCE   IP_ADDRESS   PORT   FQDN
                                   backend.example.com
    

Añadir un backend externo a un balanceador de carga

En el siguiente ejemplo se actualiza un balanceador de carga.

En el balanceador de carga, el servicio predeterminado es un servicio a Google Cloud. En el ejemplo se modifica el mapa de URLs añadiendo un comparador de rutas que envía todas las solicitudes de cart/id/1223515 al servicio de backend images, que está asociado al NEG de Internet.

Consola

Crea el servicio de backend y añade el NEG de Internet

  1. En la Google Cloud consola, ve a la página Balanceo de carga.

    Ir a Balanceo de carga

  2. Para añadir el servicio backend a un balanceador de carga, selecciona el balanceador de carga de aplicación clásico, haz clic en Menú y, a continuación, selecciona Editar.
  3. Haz clic en Configuración de backend.
  4. En el menú Servicios y segmentos de backend, selecciona Crear un servicio de backend.
  5. Asigna el nombre images al servicio de backend.
  6. En Tipo de backend, selecciona Grupo de endpoints de red de Internet.
  7. Selecciona el protocolo que quieras usar desde el balanceador de carga hasta el NEG de Internet. En este ejemplo, selecciona HTTPS.
  8. En Nuevo backend > Grupo de endpoints de red de Internet, selecciona example-fqdn-neg y, a continuación, haz clic en Hecho.
  9. Selecciona Habilitar Cloud CDN.
  10. Opcional: Modifica los ajustes de modo de caché y TTL.
  11. En Configuraciones avanzadas, en Encabezados de solicitud personalizados, haz clic en Añadir encabezado.
    1. En Nombre del encabezado, escribe Host.
    2. En Valor del encabezado, introduce backend.example.com.
  12. Haz clic en Crear.
  13. Mantén la ventana abierta para continuar.

Asociar el servicio backend a un mapa de URLs

  1. Haz clic en Reglas de host y ruta.
  2. En la primera fila o filas, se muestran los servicios en la columna de la derecha y uno de ellos ya incluye la regla predeterminada Any unmatched (default) para Hosts y Paths. Google Cloud
  3. Asegúrate de que haya una fila con images seleccionada en la columna de la derecha. Si no existe, haga clic en Añadir regla de host y ruta y seleccione images. Rellena los demás campos de la siguiente manera:
    1. En Hosts (Hosts), introduce *.
    2. En Rutas, introduce /cart/id/1223515.

Revisar y finalizar

  1. Haz clic en Revisar y finalizar.
  2. Compara los ajustes con lo que querías crear.
  3. Si todo es correcto, haz clic en Actualizar.

gcloud

  1. Crea un servicio de backend para el NEG:

    gcloud compute backend-services create images \
       --global \
       --enable-cdn \
       --cache-mode=CACHE_MODE \
       --protocol=HTTP2
    

    Define el modo de caché. Para ello, sustituye CACHE_MODE por uno de los siguientes valores:

    • CACHE_ALL_STATIC: almacena en caché automáticamente el contenido estático

    • USE_ORIGIN_HEADERS (predeterminado): requiere que el origen defina encabezados de almacenamiento en caché válidos para almacenar contenido en caché.

    • FORCE_CACHE_ALL: almacena en caché todo el contenido, ignorando las directivas private, no-store o no-cache en los encabezados de respuesta Cache-Control

  2. Configura el servicio de backend para añadir el encabezado de solicitud personalizado Host: backend.example.com a la solicitud:

    gcloud compute backend-services update images \
       --custom-request-header "Host: backend.example.com" --global
    
  3. Usa el comando backend-services add-backend para añadir el NEG de Internet al servicio de backend:

    gcloud compute backend-services add-backend images \
      --network-endpoint-group "example-fqdn-neg" \
      --global-network-endpoint-group \
      --global
    
  4. Asocia el nuevo servicio de backend al mapa de URLs del balanceador de carga creando una regla de coincidencia para dirigir las solicitudes a ese backend:

    gcloud compute url-maps add-path-matcher EXAMPLE_URL_MAP \
      --default-service=GCP_SERVICE_EXAMPLE \
      --path-matcher-name=CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE \
      --backend-service-path-rules=/CART/ID/1223515=IMAGES
    

    Haz los cambios siguientes:

    • EXAMPLE_URL_MAP: el nombre de tu mapa de URLs
    • GCP_SERVICE_EXAMPLE: el nombre de un servicio de backend predeterminado
    • CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE: el nombre de esta nueva regla de ruta.
    • /CART/ID/1223515: la ruta
    • IMAGES: el nombre del nuevo servicio de backend con el NEG de Internet adjunto

Incluye en la lista de permitidos los intervalos de IP necesarios.

Para permitir que un balanceador de carga de aplicaciones externo envíe solicitudes a tu NEG de Internet, debes consultar el registro TXT de DNS _cloud-eoips.googleusercontent.com con una herramienta como dig o nslookup.

Por ejemplo, ejecuta el siguiente comando dig:

dig TXT _cloud-eoips.googleusercontent.com | grep -Eo 'ip4:[^ ]+' | cut -d':' -f2

La salida contiene dos intervalos de IP, como se indica a continuación:

34.96.0.0/20
34.127.192.0/18

Anota los intervalos de IP y asegúrate de que tu cortafuegos o lista de control de acceso (LCA) de la nube permita estos intervalos.

Para obtener más información, consulta Autenticar solicitudes.

Conectar tu dominio a tu balanceador de carga

Una vez creado el balanceador de carga, anota la dirección IP asociada a él. Por ejemplo, 30.90.80.100. Para dirigir tu dominio a tu balanceador de carga, crea un registro A con tu servicio de registro de dominios. Si has añadido varios dominios a tu certificado SSL, debes añadir un registro A para cada uno de ellos, todos apuntando a la dirección IP del balanceador de carga. Por ejemplo, para crear registros A de www.example.com y example.com, usa lo siguiente:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

Si usas Cloud DNS como proveedor de DNS, consulta el artículo sobre cómo añadir, modificar y eliminar registros.

Probar el balanceador de carga de aplicación externo

Ahora que has configurado el balanceador de carga, puedes empezar a enviar tráfico a la dirección IP del balanceador de carga. Si has configurado un dominio, también puedes enviar tráfico al nombre de dominio. Sin embargo, la propagación de DNS puede tardar en completarse, por lo que puedes empezar usando la dirección IP para hacer pruebas.

  1. En la Google Cloud consola, ve a la página Balanceo de carga.

    Ir a Balanceo de carga

  2. Haz clic en el balanceador de carga que acabas de crear.

  3. Anota la dirección IP del balanceador de carga.

  4. Si has creado un balanceador de carga HTTP, puedes probarlo con un navegador web en http://IP_ADDRESS. Sustituye IP_ADDRESS por la dirección IP del balanceador de carga. Se te dirigirá a la página principal del servicio helloworld.

    Si has creado un balanceador de carga HTTPS, puedes probarlo con un navegador web en https://IP_ADDRESS. Sustituye IP_ADDRESS por la dirección IP del balanceador de carga. Se te dirigirá a la página principal del servicio helloworld.

    Si no funciona y estás usando un certificado gestionado por Google, confirma que el estado del recurso de tu certificado es ACTIVE. Para obtener más información, consulta el estado del recurso de certificado SSL gestionado por Google.

    También puedes usar curl desde la línea de comandos de tu máquina local. Sustituye IP_ADDRESS por la dirección IPv4 del balanceador de carga.

    Si usas un certificado gestionado por Google, prueba el dominio que apunta a la dirección IP del balanceador de carga. Por ejemplo:

    curl -s 'https://www.example.com:443' --resolve www.example.com:443:IP_ADDRESS
    

  5. Opcional: Si usas un dominio personalizado, puede que tengas que esperar a que se propaguen los ajustes de DNS actualizados. A continuación, prueba tu dominio (por ejemplo, backend.example.com) en el navegador web.

    Si necesitas ayuda para solucionar problemas, consulta el artículo Solucionar problemas de NEG y backend externo e Internet.

Probar Cloud CDN

Prueba 1: Acceder directamente al endpoint del contenedor

En esta prueba se usan los comandos time y wget de una máquina virtual. En el ejemplo se descargan los archivos /cart/id/1223515/image.jpg del contenedor backend.example.com.

En el resultado, puedes ver que la solicitud general tarda 780 ms. Este es el tiempo que se tarda en recuperar una imagen de 3,3 MB directamente de Amazon S3.

time wget backend.example.com/cart/id/1223515/image.jpg
--2020-06-26 18:22:46--  backend.example.com/cart/id/1223515/image.jpg
Resolving backend.example.com (backend.example.com)... 52.219.120.233
Connecting to backend.example.com (backend.example.com)|52.219.120.233|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.47'
/cart/id/1223515/image.jpg.47                                                 100%[==============================================================================================================================================>]   3.29M  6.25MB/s    in 0.5s
2020-06-26 18:22:47 (6.25 MB/s) - '/cart/id/1223515/image.jpg.47' saved [3447106/3447106]
real    0m0.780s
user    0m0.003s
sys     0m0.012s

Prueba 2: Primera solicitud a través de Cloud CDN

Esta prueba usa la dirección IP del balanceador de carga para recuperar el archivo /cart/id/1223515/image.jpg. Como es la primera solicitud, debería ser un fallo y Cloud CDN debería obtener la imagen del origen, que es Amazon S3. En el resultado, puedes ver que la solicitud ha tardado 844 ms.

time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:27--  http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.44'
/cart/id/1223515/image.jpg.44                                                 100%[==============================================================================================================================================>]   3.29M  8.23MB/s    in 0.4s
2020-06-26 18:19:28 (8.23 MB/s) - '/cart/id/1223515/image.jpg.44' saved [3447106/3447106]
real    0m0.844s
user    0m0.003s
sys     0m0.012s

Prueba 3: Segunda solicitud a través de la CDN

Ahora haremos una solicitud más con esta IP del balanceador de carga. Esta vez, deberíamos obtener una respuesta almacenada en caché, por lo que debería ser más rápida que las dos primeras pruebas.

Volvemos a usar la misma IP de balanceador de carga LOAD_BALANCER_IP_ADDRESS. En el resultado, podemos ver que la solicitud ha tardado solo 18 ms.

time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:29--  http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.45'
/cart/id/1223515/image.jpg.45                                                 100%[==============================================================================================================================================>]   3.29M  --.-KB/s    in 0.008s
2020-06-26 18:19:29 (423 MB/s) - '/cart/id/1223515/image.jpg.45' saved [3447106/3447106]
real    0m0.018s
user    0m0.001s
sys     0m0.010s

Verificar mediante registros

Los registros de Cloud CDN están asociados al balanceador de carga de aplicaciones externo al que están conectados los backends con Cloud CDN habilitado. Con los registros, puedes comprobar si una solicitud es un acierto o un fallo. Puedes consultar más información sobre los registros de Cloud CDN en Ver registros.

Limitaciones

  • El segmento de terceros y los objetos deben ser públicos. También puedes mantener tu contenedor y tus objetos privados si configuras la autenticación de origen privado. Los back-ends externos no admiten otros métodos de autenticación de contenido, como las URLs firmadas o las cookies firmadas.

  • Cuando se usa un servicio de backend externo que espera un valor concreto para la cabecera Host de la solicitud HTTP, debe configurar el servicio de backend para que asigne a la cabecera Host ese valor esperado. Si no configuras un encabezado de solicitud personalizado, un servicio de backend conservará el encabezado Host que el cliente haya usado para conectarse al balanceador de carga de aplicaciones externo Google Cloud . Para obtener información general sobre los encabezados personalizados, consulte Configurar encabezados de solicitud personalizados. Para ver un ejemplo específico, consulta Configurar un balanceador de carga con un backend externo.

Siguientes pasos