Configura el redireccionamiento de HTTP a HTTPS para balanceadores de cargas de HTTP(S) externos

En este ejemplo, se muestra cómo todas las solicitudes al puerto 80 se redireccionan a sus respectivos servicios de HTTPS.

Si quieres usar redireccionamientos de HTTP a HTTPS, debes crear dos balanceadores de cargas: uno para el tráfico de HTTPS y otro para el tráfico de HTTP. Cada balanceador de cargas tiene una regla de reenvío y un mapa de URL propios. Para el balanceador de cargas de HTTP, no necesitas configurar un backend.

Configura el balanceador de cargas de HTTPS

En esta guía de configuración, se muestra cómo crear un balanceador de cargas de HTTPS externo simple con los siguientes recursos:

Para ver un ejemplo multirregional basado en el contenido que incluya la configuración de certificados SSL e IPv6, consulta Configura un balanceador de cargas de HTTPS multirregional externo.

Para conocer los conceptos generales, consulta la descripción general del balanceo de cargas de HTTP(S) externo.

Si usas GKE, el controlador de Ingress de Kubernetes suele configurar el balanceador de cargas. A fin de obtener más información, consulta Configura Ingress para el balanceo de cargas externo.

Topología

En esta guía, crearás la configuración que se ilustra en el siguiente diagrama.

Balanceo de cargas de HTTPS simple (haz clic para ampliar)
Balanceo de cargas de HTTPS simple (haz clic para ampliar)

La secuencia de eventos en el diagrama es la siguiente:

  1. Un cliente envía una solicitud de contenido a la dirección IPv4 externa que se define en la regla de reenvío.
  2. La regla de reenvío dirige la solicitud al proxy HTTPS de destino.
  3. El proxy de destino usa la regla en el mapa de URL para determinar si el único servicio de backend recibe todas las solicitudes.
  4. El balanceador de cargas determina que el servicio de backend tiene solo un grupo de instancias y dirige la solicitud a una instancia de máquina virtual (VM) en ese grupo.
  5. La VM entrega el contenido que solicitó el usuario.

Antes de comenzar

Asegúrate de que tu configuración cumpla con los requisitos previos.

Configura un recurso de certificado SSL

Crea un recurso de certificado SSL como se describe a continuación:

Recomendamos que uses un certificado administrado por Google.

En este ejemplo, se supone que ya tienes un recurso de certificado SSL llamado www-ssl-cert.

Permisos

A fin de completar los pasos de esta guía, debes tener permiso para crear instancias de Compute Engine, reglas de firewall y direcciones IP reservadas en un proyecto. Debes tener la función de propietario o de editor del proyecto o las siguientes funciones de IAM de Compute Engine:

Tarea Función requerida
Crear instancias Administrador de instancias
Agregar y quitar reglas de firewall Administrador de seguridad
Crear componentes del balanceador de cargas Administrador de redes
Crear un proyecto (opcional) Creador del proyecto

Si deseas obtener más información, consulta las siguientes guías:

Crea un grupo de instancias administrado

Para configurar un balanceador de cargas con un backend de Compute Engine, tus VM deben estar en un grupo de instancias. En esta guía, se describe cómo crear un grupo de instancias administrado con las VM de Linux en las que se ejecuta Apache y, luego, configurar el balanceo de cargas.

El grupo de instancias administrado proporciona VM que ejecutan los servidores de backend de un balanceador de cargas de HTTPS externo. A modo de demostración, los backends entregan sus propios nombres de host.

Console

  1. En Google Cloud Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear grupo de instancias.
  3. A la izquierda, elige Nuevo grupo de instancias administrado.
  4. En Nombre, ingresa lb-backend-example.
  5. En Ubicación, selecciona Zona única.
  6. En Región, selecciona tu región preferida. En este ejemplo, se usa us-east1.
  7. En Zona, selecciona us-east1-b.
  8. En Plantilla de instancias, selecciona Crear una nueva plantilla de instancias.
  9. En Nombre, ingresa lb-backend-template.
  10. Asegúrate de que el disco de arranque esté establecido en una imagen de Debian, como Debian GNU/Linux 9 (stretch). En estas instrucciones, se usan comandos que solo están disponibles en Debian, como apt-get.
  11. En Administración, seguridad, discos, herramientas de redes, usuario único, en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  12. En la pestaña Herramientas de redes, agrega las siguientes etiquetas de red: allow-health-check

  13. Haz clic en Guardar y continuar.

  14. En Modo de ajuste de escala automático, selecciona Sin ajuste de escala automático.

  15. En Cantidad de instancias, ingresa 2.

  16. Para crear el grupo de instancias nuevo, haz clic en Crear.

gcloud

  1. Crea la plantilla.

    gcloud compute instance-templates create lb-backend-template \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-9 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. Crea el grupo de instancias administrado en función de la plantilla.

    gcloud compute instance-groups managed create lb-backend-example \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    

Agrega un puerto con nombre al grupo de instancias

Para tu grupo de instancias, define un servicio HTTP y asigna un nombre de puerto al puerto relevante. Una vez configurado, el servicio de balanceo de cargas reenvía el tráfico al puerto con nombre.

Console

  1. En Google Cloud Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Haz clic en el nombre de tu grupo de instancias (en este ejemplo lb-backend-example) y, luego, en Editar grupo.
  3. Haz clic en Especificar la asignación del nombre de puerto.
  4. Haz clic en Agregar elemento.
  5. En el nombre de puerto, ingresa http. En el número de puerto, ingresa y 80.
  6. Haga clic en Save.

gcloud

gcloud compute instance-groups unmanaged set-named-ports lb-backend-example \
    --named-ports http:80 \
    --zone us-east1-b

Configura una regla de firewall

En este ejemplo, se crea la regla de firewall fw-allow-health-check. Esta es una regla de entrada que permite el tráfico de los sistemas de verificación de estado de Google Cloud (130.211.0.0/2235.191.0.0/16). En este ejemplo, se usa la etiqueta de destino allow-health-check para identificar las VM.

Console

  1. En Google Cloud Console, ve a la página Firewall.

    Ir a la página Firewall

  2. Haz clic en Crear regla de firewall para crear la segunda regla de firewall:
  3. En Nombre, ingresa fw-allow-health-check.
  4. En Red, selecciona Predeterminado.
  5. En Destinos, selecciona Etiquetas de destino especificadas.
  6. Propaga el campo Etiquetas de destino con allow-health-check.
  7. Establece Filtro de fuente en Rangos de IP.
  8. Establece Rangos de IP de origen en 130.211.0.0/2235.191.0.0/16.
  9. En Protocolos y puertos, selecciona Protocolos y puertos especificados.
  10. Selecciona la casilla de verificación tcp y, luego, escribe 80 para los números de puerto.
  11. Haz clic en Crear.

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

Reserva una dirección IP externa

Ahora que tus instancias están en funcionamiento, configura una dirección IP externa, estática y global que tus clientes usarán para llegar al balanceador de cargas.

Console

  1. En Google Cloud Console, ve a la página Direcciones IP externas.

    Ir a la página Direcciones IP externas

  2. Para reservar una dirección IPv4, haz clic en Reservar dirección estática.
  3. En Nombre, ingresa lb-ipv4-1.
  4. En Nivel de servicio de red, establece Premium.
  5. Configura Versión de IP como IPv4.
  6. Establece Tipo en Global.
  7. Haz clic en Reservar.

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --global

Préstale atención a la dirección IPv4 que estaba reservada:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Configura el balanceador de cargas

En este ejemplo, se usa HTTPS entre el cliente y el balanceador de cargas, por lo que se necesita uno o más recursos de certificado SSL para configurar el proxy. Recomendamos que uses un certificado administrado por Google.

Console

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. Haz clic en Crear balanceador de cargas.
  3. En Balanceo de cargas de HTTP(S), haz clic en Iniciar configuración.
  4. Selecciona De Internet a mis VM y, luego, haz clic en Continuar.
  5. En el campo Nombre del balanceador de cargas, ingresa web-map-https.
  6. Haz clic en Configuración de backend.
    1. En Crear o seleccionar servicios y depósitos de backend, selecciona Servicios de backend > Crear un servicio de backend.
    2. Agrega un nombre al servicio de backend, como web-backend-service.
    3. En Protocolo, selecciona HTTP.
    4. En el Puerto con nombre, ingresa http.
    5. En Backends > Nuevo Backend > Grupo de instancias, selecciona tu grupo de instancias, lb-backend-example.
    6. En Números de puerto, ingresa 80.
    7. Mantén la configuración predeterminada.
    8. En Verificación de estado, selecciona Crear una verificación de estado y, luego, agrega un nombre para la verificación de estado, como http-basic-check.
    9. Configura el protocolo como HTTP y haz clic en Guardar y continuar.
    10. Mantén la configuración predeterminada.
    11. Haz clic en Crear.
  7. En Reglas de host y de ruta de acceso, mantén la configuración predeterminada.
  8. En Configuración de frontend, usa los siguientes valores:
    1. En Protocolo, establece HTTPS.
    2. Configura Dirección IP como lb-ipv4-1, la que creaste antes.
    3. Asegúrate de que el valor de Puerto esté configurado como 443 para permitir el tráfico HTTPS.
    4. Haz clic en la lista desplegable Certificado y selecciona tu certificado SSL principal.
    5. Haz clic en Listo.
  9. Haz clic en Revisar y finalizar.
  10. Cuando termines de configurar el balanceador de cargas, haz clic en Crear.
  11. Espera a que se cree el balanceador de cargas.
  12. Haz clic en el nombre del balanceador de cargas.
  13. En la pantalla Detalles del balanceador de cargas, toma nota del valor de IP:Puerto de tu balanceador de cargas.

gcloud

  1. Crea una verificación de estado.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. Crea un servicio de backend.
        gcloud compute backend-services create web-backend-service \
            --protocol=HTTP \
            --port-name=http \
            --health-checks=http-basic-check \
            --global
        
  3. Agrega tu grupo de instancias como backend al servicio de backend:
        gcloud compute backend-services add-backend web-backend-service \
            --instance-group=lb-backend-example \
            --instance-group-zone=us-east1-b \
            --global
        
  4. Crea un mapa de URL para enrutar las solicitudes entrantes al servicio de backend predeterminado.
        gcloud compute url-maps create web-map-https \
            --default-service web-backend-service
        
  5. Si aún no lo hiciste, crea el recurso de certificado SSL global, como se muestra en:

    En el siguiente ejemplo, se supone que ya tienes un archivo de certificado llamado certificate-file y un archivo de clave privada llamado private-key-file. En el ejemplo, se crea un recurso de certificado SSL llamado www-ssl-cert.

        gcloud compute ssl-certificates create www-ssl-cert \
            --certificate=certificate-file \
            --private-key=private-key-file \
            --global
        
  6. Crea un proxy HTTPS de destino para enrutar las solicitudes a tu mapa de URL. El proxy es la parte del balanceador de cargas que contiene el certificado SSL para el balanceo de cargas de HTTPS, por lo que también debes cargar el certificado en este paso.
        gcloud compute target-https-proxies create https-lb-proxy \
            --url-map web-map-https --ssl-certificates www-ssl-cert
        
  7. Crea una regla de reenvío global para enrutar las solicitudes entrantes al proxy.
        gcloud compute forwarding-rules create https-content-rule \
            --address=lb-ipv4-1\
            --global \
            --target-https-proxy=https-lb-proxy \
            --ports=443
        

Envía tráfico a tus instancias

Ahora que el servicio de balanceo de cargas está en ejecución, puedes enviar tráfico a la regla de reenvío y ver cómo este se dispersa en las diferentes instancias.

Console

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. Haz clic en el balanceador de cargas que acabas de crear.
  3. En la sección Backend, confirma que las VM estén en buen estado. La columna En buen estado debe estar propagada, de modo que se indique que ambas VM están en buen estado (2/2). Si no ves esto, vuelve a cargar la página. Puede tomar unos minutos que Cloud Console indique que las VM están en buen estado. Si los backends no se muestran en buen estado después de unos minutos, revisa la configuración del firewall y la etiqueta de red asignada a tus VM de backend.
  4. Si usas un certificado administrado por Google, confirma que el estado de tu recurso de certificado sea ACTIVE. Para obtener más información, consulta Estado de los recursos de certificado SSL administrado por Google.
  5. Una vez que Cloud Console muestre que las instancias de backend están en buen estado, puedes probar tu balanceador de cargas con un navegador web si te diriges a https://IP_ADDRESS. Reemplaza IP_ADDRESS por la dirección IP del balanceador de cargas.
  6. Si usaste un certificado autofirmado para las pruebas, el navegador mostrará una advertencia. Debes indicar de manera explícita a tu navegador que acepte un certificado autofirmado.
  7. El navegador debe procesar una página con contenido que muestre el nombre de la instancia que entregó la página, junto con su zona (por ejemplo, Page served from: lb-backend-example-xxxx). Si el navegador no procesa esta página, revisa las opciones de configuración que aparecen en esta guía.

Cuando termines, Cloud Console mostrará información sobre tu balanceador de cargas de HTTPS de la siguiente manera.

Balanceador de cargas de HTTPS

Configura el balanceador de cargas de HTTP

El balanceador de cargas de HTTP no incluye un backend. Solo tiene un mapa de URL y una regla de reenvío para manejar el tráfico HTTP, como se muestra en el diagrama y el ejemplo que se incluyen a continuación.

Configuración de reescritura de HTTP a HTTPS (haz clic para ampliar)
Configuración de reescritura de HTTP a HTTPS

Como se muestra en el diagrama, el mapa de URL del balanceador de cargas de HTTP contiene las siguientes instrucciones de redireccionamiento:

defaultUrlRedirect:
  redirectResponseCode:$RESPONSE_CODE
  httpsRedirect: True

Reemplaza RESPONSE_CODE por un código de respuesta compatible.

Para configurar el balanceador de cargas de HTTP, sigue estos pasos.

Console

Asigna un nombre a tu balanceador de cargas

  1. En Google Cloud Console, ve a la página Balanceo de cargas.

    Ir a la página Balanceo de cargas

  2. En Balanceo de cargas de HTTP(S), haz clic en Iniciar configuración.
  3. Selecciona De Internet a mis VM y, luego, haz clic en Continuar.
  4. Para el Nombre del balanceador de cargas, ingresa web-map-http.
  5. Mantén la ventana abierta para continuar.

Configura las reglas de host y de ruta de acceso

Con las reglas de host y ruta de acceso se configura el recurso de asignación de URL del balanceador de cargas.

  1. En la columna izquierda de la pantalla, haz clic en Reglas de host y de ruta de acceso.
  2. Selecciona Regla avanzada de host y de ruta de acceso (redireccionamiento y reescritura de URL).
  3. En Acción, selecciona Redireccionar el cliente a otro host/ruta de acceso.
  4. En Redireccionamiento de ruta de acceso, selecciona Redireccionamiento de prefijo.
  5. En Código de respuesta de redireccionamiento, selecciona 301 (Movido permanentemente).
  6. En Redireccionamiento a HTTPS, selecciona Habilitar.
  7. Haz clic en Listo.

Configura el frontend

  1. En el panel izquierdo, haz clic en Configuración de frontend.
  2. En Nombre, ingresa http-content-rule.
  3. Configura Protocolo como HTTP.
  4. Mantén la ventana abierta para continuar.

Configura la regla de reenvío de IPv4

  1. Configura Versión de IP como IPv4.
  2. Configura Dirección IP como lb-ipv4-1, la que creaste antes.
  3. Asegúrate de que el valor de Puerto esté establecido en 80 para permitir el tráfico HTTP.
  4. Haz clic en Listo.
  5. Mantén la ventana abierta para continuar.

Revisa y finaliza

  1. En el panel izquierdo, haz clic en Revisar y finalizar.
  2. Compara tu configuración con lo que pretendías crear.
  3. Si todo parece correcto, haz clic en Crear para crear tu balanceador de cargas de HTTP.

gcloud

  1. Crea un archivo YAML /tmp/web-map-http.yaml. En este ejemplo, se usa MOVED_PERMANENTLY_DEFAULT como código de respuesta.

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
       redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
       httpsRedirect: True
    
  2. Crea el mapa de URL del balanceador de cargas de HTTP mediante la importación del archivo YAML. El nombre de este mapa de URL es web-map-http.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

    Si actualizas un mapa de URL existente, aparecerá el siguiente mensaje:

    Url Map [web-map-http] will be overwritten.
    
    Do you want to continue (Y/n)?
    

    Para continuar, presiona Y.

  3. Verifica que el mapa de URL esté actualizado. El mapa de URL de tu balanceador de cargas de HTTP debería ser similar al siguiente:

    gcloud compute url-maps describe web-map-http
    
    creationTimestamp: '2020-03-23T10:53:44.976-07:00'
    defaultUrlRedirect:
     httpsRedirect: true
     redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
    fingerprint: 3A5N_RLrED8=
    id: '2020316695093397831'
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  4. Crea un proxy HTTP de destino nuevo o actualiza uno existente con web-map-http como el mapa de URL.

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=web-map-http \
       --global
    

    O

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  5. Crea una regla de reenvío global para enrutar las solicitudes entrantes al proxy.

    gcloud compute forwarding-rules create http-content-rule \
       --address=lb-ipv4-1\
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    

Cuando termines, Cloud Console mostrará dos balanceadores de cargas de la siguiente manera.

Ambos balanceadores de cargas

Cloud Console muestra información sobre tu balanceador de cargas web-map-http de la siguiente manera.

Balanceador de cargas de HTTP

Realiza pruebas

Préstale atención a la dirección IPv4 que se reservó:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Si suponemos que la dirección IP reservada representada por lb-ipv4-1 es 34.98.77.106, http://34.98.77.106/ redirecciona a https://34.98.77.106/.

Puedes probar esto en un navegador.

Después de unos minutos, también puedes ejecutar el siguiente comando de curl.

curl 34.98.77.106:80
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://34.98.77.106/">here</A>.
</BODY></HTML>

Reemplaza 34.98.77.106 por tu dirección IP reservada.