Configura un balanceador de cargas de aplicaciones clásico con buckets de Cloud Storage

En este documento, se muestra cómo crear un balanceador de cargas de aplicaciones externo para enrutar las solicitudes de contenido estático a buckets de Cloud Storage. Después de configurar un balanceador de cargas con los buckets de backend, las solicitudes a rutas de URL que comienzan con /love-to-fetch se envían al bucket de Cloud Storage us-east1, y todas las demás solicitudes se envían al bucket de Cloud Storage europe-north1, sin importar la región del usuario.

Si tus backends entregan contenido dinámico a través de HTTP(S), considera usar servicios de backend en lugar de buckets de backend.


Para seguir la guía paso a paso en esta tarea directamente en la consola de Google Cloud, haz clic en Guiarme:

GUIARME


Usa buckets de Cloud Storage como backends del balanceador de cargas

Un balanceador de cargas de aplicaciones externo usa un mapa de URL para dirigir el tráfico de las rutas de URL especificadas a tus backends.

En el siguiente diagrama, el balanceador de cargas envía tráfico mediante una ruta de acceso de /love-to-fetch/ a un bucket de Cloud Storage en la región us-east1. Todas las demás solicitudes van a un bucket de Cloud Storage en la región europe-north1.

El balanceador de cargas envía tráfico a un backend de Cloud Storage.
Distribuye el tráfico a Cloud Storage

De forma predeterminada, Cloud Storage usa la misma caché que usa Cloud CDN. Si habilitas Cloud CDN en el bucket de backend, puedes usar los controles de Cloud CDN en tu contenido. Los controles de Cloud CDN incluyen, por ejemplo, los modos de almacenamiento en caché, las URL firmadas y la invalidación. Cloud CDN también te permite almacenar en caché contenido grande (más de 10 MB). Si no habilitas Cloud CDN en tu bucket de backend, solo puedes usar encabezados Cache-Control de origen para controlar el almacenamiento en caché del contenido más pequeño, como lo configuran los metadatos de Cloud Storage.

Antes de comenzar

Asegúrate de que tu configuración cumpla con los requisitos. Si usas la utilidad gcloud storage, puedes instalarla con las instrucciones de Descubre el almacenamiento de objetos con la herramienta de gcloud.

Configura un proyecto predeterminado

Consola

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  5. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

gcloud

gcloud config set project PROJECT_ID

Reemplaza PROJECT_ID por el proyecto que usas para esta guía.

Terraform

export GOOGLE_CLOUD_PROJECT=PROJECT_ID

Permisos

Para seguir esta guía, debes crear un balanceador de cargas y buckets de Cloud Storage en un proyecto. Debes ser propietario o editor de un proyecto o tener las siguientes funciones de IAM de Compute Engine:

Tarea Función requerida
Crea componentes del balanceador de cargas Administrador de redes
Crea buckets de Cloud Storage Administrador de objetos de almacenamiento

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

Configura un SSL certificate resource

Para un balanceador de cargas HTTPS, crea un SSL certificate resource como se describe en el documento a continuación:

Recomendamos que uses un certificado administrado por Google.

En este ejemplo, se supone que ya tienes un SSL certificate resource llamado www-ssl-cert.

Prepara el contenido y los buckets de Cloud Storage

El proceso para preparar los buckets de Cloud Storage es el siguiente:

  • Se crean los buckets.

  • Se copia el contenido en los buckets.

  • Se proporciona acceso público a los buckets.

Crea buckets de Cloud Storage

En este ejemplo, se crean dos buckets de Cloud Storage para que el balanceador de cargas acceda. Para implementaciones de producción, te recomendamos que elijas un bucket multirregión, que replica de manera automática los objetos en varias regiones de Google Cloud. Esto puede mejorar la disponibilidad de tu contenido y la tolerancia a errores en tu aplicación.

Toma nota de los nombres de los buckets de Cloud Storage que creas, ya que se usan más adelante. En esta guía, se denominan BUCKET_1_NAME y BUCKET_2_NAME.

Console

  1. En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.

    Ir a Buckets de Cloud Storage

  2. Haga clic en Crear bucket.

  3. En el cuadro Asigna un nombre a tu bucket, ingresa un nombre global único que siga los lineamientos de nomenclatura.

  4. Haz clic en Elige dónde almacenar tus datos.

  5. Configura Tipo de ubicación como Región.

  6. Configura la Ubicación como europe-north1. Esto es BUCKET_1_NAME en esta guía.

  7. Haga clic en Crear.

  8. Haz clic en Buckets para volver a la página Buckets de Cloud Storage. Usa estas instrucciones para crear un segundo bucket, pero establece la Ubicación en us-east1. Esto es BUCKET_2_NAME en esta guía.

gcloud

gcloud storage buckets create gs://BUCKET_1_NAME --project=PROJECT_ID --default-storage-class=standard --location=europe-north1 --uniform-bucket-level-access
gcloud storage buckets create gs://BUCKET_2_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access

Reemplaza BUCKET_1_NAME y BUCKET_2_NAME por los nombres de los buckets que deseas crear.

Terraform

Para crear los depósitos, usa el recurso google_storage_bucket.

# Create Cloud Storage buckets
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

resource "google_storage_bucket" "bucket_1" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-1"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

resource "google_storage_bucket" "bucket_2" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-2"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Transfiere contenido a tus buckets de Cloud Storage

Para poder probar la configuración más adelante, copia las siguientes imágenes de un bucket público de Cloud Storage en tus propios buckets de Cloud Storage.

gcloud

  1. Haz clic en Activate Cloud Shell (Activar Cloud Shell).

  2. Ejecuta el siguiente comando en Cloud Shell y reemplaza las variables de nombre del bucket por los nombres de tus buckets de Cloud Storage:

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_1_NAME/never-fetch/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_2_NAME/love-to-fetch/

Terraform

Para copiar elementos en el bucket, puedes usar el recurso google_storage_bucket_object.

resource "google_storage_bucket_object" "cat_image" {
  name         = "never-fetch/three-cats.jpg"
  source       = "images/three-cats.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_1.name
}

resource "google_storage_bucket_object" "dog_image" {
  name         = "love-to-fetch/two-dogs.jpg"
  source       = "images/two-dogs.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_2.name
}

Como alternativa, usa el recurso null_resource.

resource "null_resource" "upload_cat_image" {
provisioner "local-exec" {
  command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.bucket_1.name}/never-fetch/"
}
}

resource "null_resource" "upload_dog_image" {
provisioner "local-exec" {
  command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://${google_storage_bucket.bucket_2.name}/love-to-fetch/"
}
}

En la consola de Google Cloud, haz clic en Actualizar en la página de detalles de cada bucket para verificar que el archivo se haya copiado correctamente.

Haz que los buckets de Cloud Storage sean legibles de forma pública

Cuando haces que los buckets de Cloud Storage sean legibles de forma pública, cualquier persona en Internet puede enumerar y ver sus objetos y ver sus metadatos (sin incluir las LCA). No incluyas información sensible en los buckets públicos.

Para reducir la probabilidad de exposición accidental de información sensible, no almacenes objetos públicos y datos sensibles en el mismo bucket.

Consola

A fin de otorgar a todos los usuarios acceso para ver objetos en tus buckets, repite el siguiente procedimiento para cada bucket:

  1. En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.

    Ir a Buckets de Cloud Storage

  2. Haz clic en el nombre del bucket seguido de la pestaña Permisos.

  3. Haz clic en Agregar.

  4. En el cuadro Nuevos principales, ingresa allUsers.

  5. En el cuadro Selecciona una función, selecciona Cloud Storage > Visualizador de objetos de Storage.

  6. Haz clic en Guardar.

  7. Haz clic en Permitir acceso público.

gcloud

Ejecuta los siguientes comandos a fin de otorgar a todos los usuarios acceso para ver objetos en tus buckets:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME --member=allUsers --role=roles/storage.objectViewer

Terraform

Si quieres otorgar acceso a todos los usuarios para ver objetos en tus buckets, usa el recurso google_storage_bucket_iam_member y especifica el miembro allUsers.

# Make buckets public
resource "google_storage_bucket_iam_member" "bucket_1" {
  bucket = google_storage_bucket.bucket_1.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

resource "google_storage_bucket_iam_member" "bucket_2" {
  bucket = google_storage_bucket.bucket_2.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

Reservar una dirección IP externa

Después de configurar los buckets de Cloud Storage, puedes reservar una dirección IP externa estática global que tu público use para llegar al balanceador de cargas.

Este paso es opcional, pero se recomienda hacerlo, ya que una dirección IP externa estática proporciona una sola dirección a la que puedes apuntar tu dominio.

Consola

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

    Ir a Direcciones IP externas

  2. Haz clic en Reservar dirección estática.

  3. En el cuadro Nombre, ingresa example-ip.

  4. Establece el Nivel de servicio de red en Premium.

  5. Configura la Versión de IP como IPv4.

  6. Configura el Tipo como Global.

  7. Haz clic en Reservar.

gcloud

gcloud compute addresses create example-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Tome nota de la dirección IPv4 que estaba reservada:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

Terraform

Para reservar una dirección IP externa, usa el recurso google_compute_global_address.

# Reserve IP address
resource "google_compute_global_address" "default" {
  name = "example-ip"
}

Crea un balanceador de cargas de aplicaciones externo con buckets de backend

En estas instrucciones, se explica cómo crear un balanceador de cargas de HTTP o HTTPS. Si quieres crear un balanceador de cargas de HTTPS, debes agregar un SSL certificate resource al frontend del balanceador de cargas. Para obtener más información, consulta Descripción general de certificados SSL.

Console

Inicia la configuración

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

    Ir a Balanceo de cargas

  2. Haz clic en Crear balanceador de cargas.
  3. En la tarjeta Balanceador de cargas de aplicaciones (HTTP/S), haz clic en Iniciar configuración.
  4. En Orientado a Internet o solo interno, selecciona De Internet a mis VMs o servicios sin servidores.
  5. En Global o regional, selecciona Balanceador de cargas de aplicaciones clásico.
  6. Haz clic en Continuar.

Configure el backend

  1. En el cuadro Nombre, ingresa http-lb.

  2. Haz clic en Configuración de backend.

  3. Haz clic en las casillas Servicios de backend y Buckets de backend y, luego, en Crear un bucket de backend.

  4. En el cuadro Nombre del bucket de backend, ingresa cats.

  5. En el cuadro Bucket de Cloud Storage, haz clic en Explorar.

  6. Selecciona BUCKET_1_NAME y, luego, haz clic en Seleccionar. La creación del bucket de backend cats primero lo convierte en el predeterminado, al cual se dirigen todas las solicitudes de tráfico no coincidentes. No puedes cambiar las reglas de redireccionamiento de un bucket de backend predeterminado en el balanceador de cargas.

  7. Haga clic en Crear.

  8. Usa el mismo proceso para crear un bucket de backend llamado dogs y selecciona BUCKET_2_NAME.

  9. Haz clic en OK.

Configura reglas de enrutamiento

Las reglas de enrutamiento determinan cómo se dirige el tráfico. Para configurar el enrutamiento, deberás configurar las reglas del host y comparadores de rutas de acceso, que son componentes de configuración de un mapa de URL del balanceador de cargas de aplicaciones externo. Para configurar las reglas de este ejemplo, haz lo siguiente:

  1. Haz clic en Reglas de host y ruta.
  2. En dogs, ingresa * en el campo Hosts y /love-to-fetch/* en el campo Rutas.

Configura el frontend

  1. Haz clic en Configuración de frontend.

  2. Verifica que las siguientes opciones estén configuradas con estos valores:

    Propiedad Valor (escribe un valor o selecciona una opción como se especifica)
    Protocolo HTTP
    Nivel de servicio de red Premium
    Versión de IP IPv4
    Dirección IP example-ip
    Puerto 80

    Si deseas crear un balanceador de cargas de HTTPS en lugar de un balanceador de cargas de HTTP, debes tener un certificado SSL (gcloud compute ssl-certificates list) y debes completar los campos de la siguiente manera:

    Propiedad Valor (escribe un valor o selecciona una opción como se especifica)
    Protocolo HTTP(S)
    Nivel de servicio de red Premium
    Versión de IP IPv4
    Dirección IP example-ip
    Puerto 443
    Selecciona un certificado o crea uno nuevo
    (Opcional) Habilitar el redireccionamiento de HTTP a HTTPS Usa esta casilla de verificación para habilitar los redireccionamientos.

    Si habilitas esta casilla de verificación, se creará un balanceador de cargas HTTP parcial adicional que usa la misma dirección IP que tu balanceador de cargas HTTPS y redirecciona las solicitudes HTTP al frontend de HTTPS del balanceador de cargas.

    Esta casilla de verificación solo se puede seleccionar cuando se selecciona el protocolo HTTPS y se usa una dirección IP reservada.

  3. Haz clic en Listo.

Revisa la configuración

  1. Haz clic en Revisar y finalizar.

  2. Revisa el Frontend, las Reglas de host y ruta de acceso y los Buckets de backend.

  3. Haz clic en Crear y espere a que se cree el balanceador de cargas.

  4. Haz clic en el nombre del balanceador de cargas (http-lb).

  5. Anota la dirección IP del balanceador de cargas para la siguiente tarea. En esta guía, se hace referencia a ella como IP_ADDRESS.

gcloud

Configura el backend

gcloud compute backend-buckets create cats \
  --gcs-bucket-name=BUCKET_1_NAME
gcloud compute backend-buckets create dogs \
  --gcs-bucket-name=BUCKET_2_NAME

Configura el mapa de URL

gcloud compute url-maps create http-lb \
  --default-backend-bucket=cats
gcloud compute url-maps add-path-matcher http-lb \
  --path-matcher-name=path-matcher-2 \
  --new-hosts=* \
  --backend-bucket-path-rules="/love-to-fetch/*=dogs" \
  --default-backend-bucket=cats

Configura el proxy de destino

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

Configura la regla de reenvío

gcloud compute forwarding-rules create http-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL \
  --network-tier=PREMIUM \
  --address=example-ip \
  --global \
  --target-http-proxy=http-lb-proxy \
  --ports=80

Terraform

Para crear el balanceador de cargas, usa los siguientes recursos de Terraform.

Configure el backend

Para crear el servicio de backend, usa el recurso google_compute_backend_bucket.

# Create LB backend buckets
resource "google_compute_backend_bucket" "bucket_1" {
  name        = "cats"
  description = "Contains cat image"
  bucket_name = google_storage_bucket.bucket_1.name
}

resource "google_compute_backend_bucket" "bucket_2" {
  name        = "dogs"
  description = "Contains dog image"
  bucket_name = google_storage_bucket.bucket_2.name
}

Configura el mapa de URL

Para crear el mapa de URL, usa el recurso google_compute_url_map.

# Create url map
resource "google_compute_url_map" "default" {
  name = "http-lb"

  default_service = google_compute_backend_bucket.bucket_1.id

  host_rule {
    hosts        = ["*"]
    path_matcher = "path-matcher-2"
  }
  path_matcher {
    name            = "path-matcher-2"
    default_service = google_compute_backend_bucket.bucket_1.id

    path_rule {
      paths   = ["/love-to-fetch/*"]
      service = google_compute_backend_bucket.bucket_2.id
    }
  }
}

Configura el proxy de destino

Para crear el proxy HTTP de destino, usa el recurso google_compute_target_http_proxy.

# Create HTTP target proxy
resource "google_compute_target_http_proxy" "default" {
  name    = "http-lb-proxy"
  url_map = google_compute_url_map.default.id
}

Configura la regla de reenvío

Para crear la regla de reenvío, usa el recurso google_compute_global_forwarding_rule.

# Create forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL_MANAGED"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}

NOTA: Para cambiar el modo al balanceador de cargas de aplicaciones clásico, configura el atributo load_balancing_scheme en "EXTERNAL" en lugar de "EXTERNAL_MANAGED".

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Envía tráfico a tu balanceador de cargas

Varios minutos después de configurar el balanceador de cargas, puedes comenzar a enviar tráfico a la dirección IP del balanceador de cargas.

Console

En un navegador web, navega a las siguientes direcciones para probar el balanceador de cargas y reemplaza IP_ADDRESS por la dirección IP del balanceador de cargas:

  • http://IP_ADDRESS/love-to-fetch/two-dogs.jpg

  • http://IP_ADDRESS/never-fetch/three-cats.jpg

Si configuraste un balanceador de cargas de HTTP, asegúrate de que el navegador no redireccione de forma automática a HTTPS.

gcloud

Usa el comando curl para probar la respuesta de estas URL. Reemplaza IP_ADDRESS por la dirección IPv4 del balanceador de cargas:

curl http://IP_ADDRESS/love-to-fetch/two-dogs.jpg
curl http://IP_ADDRESS/never-fetch/three-cats.jpg

Limitaciones