Configure um balanceador de carga de aplicações clássico com contentores do Cloud Storage

Este documento mostra como criar um Application Load Balancer externo para encaminhar pedidos de conteúdo estático para contentores do Cloud Storage. Depois de configurar um equilibrador de carga com os contentores de back-end, os pedidos de caminhos de URL que começam com /love-to-fetch são enviados para o contentor do us-east1 Cloud Storage e todos os outros pedidos são enviados para o contentor do europe-north1 Cloud Storage, independentemente da região do utilizador.

Se os seus back-ends publicarem conteúdo dinâmico através de HTTP(S), considere usar serviços de back-end em vez de buckets de back-end.


Para seguir orientações passo a passo para esta tarefa diretamente na Google Cloud consola, clique em Orientar-me:

Visita guiada


Contentores do Cloud Storage como back-ends do balanceador de carga

Um balanceador de carga de aplicações externo usa um mapa de URLs para direcionar o tráfego de caminhos de URLs especificados para os seus back-ends.

No diagrama seguinte, o balanceador de carga envia tráfego com um caminho de /love-to-fetch/ para um contentor do Cloud Storage na região us-east1. Todos os outros pedidos são enviados para um contentor do Cloud Storage na região europe-north1.

O balanceador de carga envia tráfego para um back-end do Cloud Storage.
Distribuir tráfego para o Cloud Storage

Por predefinição, o Cloud Storage usa a mesma cache que o Cloud CDN usa. Se ativar a RFC do Google Cloud no contentor de back-end, pode usar os controlos da RFC do Google Cloud no seu conteúdo. Os controlos da CDN na nuvem incluem, por exemplo, modos de cache, URLs assinados e anulação. A RFC de multimédia na nuvem também lhe permite colocar em cache conteúdo grande (> 10 MB). Se não ativar a RFC do Google Cloud no seu contentor de back-end, só pode usar cabeçalhos de origem Cache-Control para controlar o armazenamento em cache de conteúdo mais pequeno, conforme definido pelos metadados do Google Cloud Storage.

Antes de começar

Certifique-se de que a configuração cumpre os seguintes pré-requisitos. Se estiver a usar o utilitário gcloud storage, pode instalá-lo seguindo as instruções em Descubra o armazenamento de objetos com a ferramenta gcloud.

Predefina um projeto

Consola

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. gcloud

    gcloud config set project PROJECT_ID
    

    Substitua PROJECT_ID pelo projeto que está a usar para este guia.

    Terraform

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    

Autorizações

Para seguir este guia, tem de criar contentores do Cloud Storage e um equilibrador de carga num projeto. Deve ser proprietário ou editor do projeto, ou ter as funções do IAM do Compute Engine seguintes:

Tarefa Função necessária
Crie componentes do balanceador de carga Administrador da rede
Crie contentores do Cloud Storage Administrador de objetos de armazenamento

Para mais informações, consulte os seguintes guias:

Configure um recurso de certificado SSL

Para um balanceador de carga HTTPS, crie um recurso de certificado SSL, conforme descrito na documentação seguinte:

Recomendamos a utilização de um certificado gerido pela Google.

Este exemplo pressupõe que já tem um recurso de certificado SSL denominado www-ssl-cert.

Prepare os seus contentores e conteúdo do Cloud Storage

O processo de preparação dos contentores do Cloud Storage é o seguinte:

  • Crie os contentores.

  • Copie conteúdo para os contentores.

  • Fornecer acesso público aos contentores.

Crie contentores do Cloud Storage

Neste exemplo, cria dois contentores do Cloud Storage para o equilibrador de carga aceder. Para implementações de produção, recomendamos que escolha um contentor de várias regiões, que replica automaticamente os objetos em várias Google Cloud regiões. Isto pode melhorar a disponibilidade do seu conteúdo e melhorar a tolerância a falhas na sua aplicação.

Tome nota dos nomes dos contentores do Cloud Storage que criar, uma vez que são usados mais tarde. Neste guia, são referidos como BUCKET_1_NAME e BUCKET_2_NAME.

Consola

  1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

    Aceda aos contentores do Cloud Storage

  2. Clique em Criar contentor.

  3. Na caixa Dê um nome ao seu contentor, introduza um nome globalmente exclusivo que siga as diretrizes de nomenclatura.

  4. Clique em Escolher onde quer armazenar os seus dados.

  5. Defina o Tipo de localização como Região.

  6. Defina a Localização como europe-north1. Isto é BUCKET_1_NAME neste guia.

  7. Clique em Criar.

  8. Clique em Recipientes para regressar à página de recipientes do Cloud Storage. Use estas instruções para criar um segundo contentor, mas defina a Localização como us-east1. Isto é BUCKET_2_NAME neste guia.

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

Substitua BUCKET_1_NAME e BUCKET_2_NAME pelos nomes dos contentores que quer criar.

Terraform

Para criar os contentores, use o 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
}

Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.

Transfira conteúdo para os seus contentores do Cloud Storage

Para poder testar a configuração mais tarde, copie as seguintes imagens de um contentor do Cloud Storage público para os seus próprios contentores do Cloud Storage.

gcloud

  1. Clique em Ativar Cloud Shell.

  2. Execute os seguintes comandos no Cloud Shell, substituindo as variáveis de nome do contentor pelos nomes dos seus contentores do 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/two-dogs.jpg gs://BUCKET_2_NAME/love-to-fetch/

Terraform

Para copiar itens para o contentor, pode usar o recursogoogle_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
}

Em alternativa, use o 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/"
}
}

Na Google Cloud consola, clique em Atualizar na página de detalhes de cada contentor para verificar se o ficheiro foi copiado com êxito.

Torne os seus contentores do Cloud Storage legíveis publicamente

Quando torna os contentores do Cloud Storage legíveis publicamente, qualquer pessoa na Internet pode listar e ver os respetivos objetos, bem como ver os respetivos metadados (excluindo as ACLs). Não inclua informações confidenciais nos seus contentores públicos.

Para reduzir a probabilidade de exposição acidental de informações confidenciais, não armazene objetos públicos e dados confidenciais no mesmo contentor.

Consola

Para conceder a todos os utilizadores acesso à visualização de objetos nos seus contentores, repita o seguinte procedimento para cada contentor:

  1. Na Google Cloud consola, aceda à página Buckets do Cloud Storage.

    Aceda aos contentores do Cloud Storage

  2. Clique no nome do contentor e, de seguida, no separador Autorizações.

  3. Clique em Adicionar.

  4. Na caixa Novos membros, introduza allUsers.

  5. Na caixa Selecionar uma função, selecione Cloud Storage > Storage Object Viewer.

  6. Clique em Guardar.

  7. Clique em Permitir acesso público.

gcloud

Para conceder a todos os utilizadores acesso à visualização de objetos nos seus contentores, execute os seguintes comandos:

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

Para conceder a todos os utilizadores acesso à visualização de objetos nos seus contentores, use o recurso google_storage_bucket_iam_member e especifique o allUsers membro.

# 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"
}

Reserve um endereço IP externo

Depois de configurar os contentores do Cloud Storage, pode reservar um endereço IP externo estático global que o seu público usa para alcançar o equilibrador de carga.

Este passo é opcional, mas recomendado, uma vez que um endereço IP externo estático fornece um único endereço para apontar o seu domínio.

Consola

  1. Na Google Cloud consola, aceda à página Endereços IP externos.

    Aceda a Endereços IP externos

  2. Clique em Reservar endereço estático.

  3. Na caixa Nome, introduza example-ip.

  4. Defina o Nível de serviço de rede como Premium.

  5. Defina a versão do IP como IPv4.

  6. Defina o Tipo como Global.

  7. Clique em Reservar.

gcloud

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

Tome nota do endereço IPv4 que foi reservado:

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

Terraform

Para reservar um endereço IP externo, use o recurso google_compute_global_address.

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

Crie um balanceador de carga de aplicações externo com contentores de back-end

Estas instruções abrangem a criação de um balanceador de carga HTTP ou HTTPS. Para criar um balanceador de carga HTTPS, tem de adicionar um recurso de certificado SSL ao frontend do balanceador de carga. Para mais informações, consulte a Vista geral dos certificados SSL.

Consola

Selecione o tipo de balanceador de carga

  1. Na Google Cloud consola, aceda à página Equilíbrio de carga.

    Aceda a Balanceamento de carga

  2. Clique em Criar equilibrador de carga.
  3. Em Tipo de balanceador de carga, selecione Balanceador de carga de aplicações (HTTP/HTTPS) e clique em Seguinte.
  4. Para Público ou interno, selecione Público (externo) e clique em Seguinte.
  5. Para a Implementação global ou de região única, selecione Melhor para cargas de trabalho globais e clique em Seguinte.
  6. Para Geração do balanceador de carga, selecione Classic Application Load Balancer e clique em Seguinte.
  7. Clique em Configurar.

Configuração básica

  1. Na caixa Nome, introduza http-lb.

Configure o back-end

  1. Clique em Configuração de back-end.

  2. Clique na caixa Serviços de back-end e contentores de back-end e, de seguida, clique em Criar um contentor de back-end.

  3. Na caixa Nome do contentor de back-end, introduza cats.

  4. Na caixa Contentor do Cloud Storage, clique em Procurar.

  5. Selecione BUCKET_1_NAME e, de seguida, clique em Selecionar. A criação do contentor de back-end primeiro torna-o o predefinido, para onde todos os pedidos de tráfego não correspondentes são direcionados.cats Não pode alterar as regras de redirecionamento de um bucket de back-end predefinido no equilibrador de carga.

  6. Clique em Criar.

  7. Use o mesmo processo para criar um contentor de back-end com o nome dogs e selecione BUCKET_2_NAME.

  8. Clique em OK.

Configure regras de encaminhamento

As regras de encaminhamento determinam como o seu tráfego é direcionado. Para configurar o encaminhamento, configura regras de anfitrião e correspondências de caminhos, que são componentes de configuração de um mapa de URLs do Application Load Balancer externo. Para configurar as regras para este exemplo:

  1. Clique em Regras de anfitrião e caminho.
  2. Para dogs, introduza * no campo Hosts e /love-to-fetch/* no campo Paths.

Configure a interface

  1. Clique em Configuração do front-end.

  2. Verifique se as seguintes opções estão configuradas com estes valores:

    Propriedade Valor (introduza um valor ou selecione uma opção conforme especificado)
    Protocolo HTTP
    Nível de serviço de rede Premium
    Versão do IP IPv4
    Endereço IP example-ip
    Porta 80

    Se quiser criar um balanceador de carga HTTPS em vez de um balanceador de carga HTTP, tem de ter um certificado SSL (gcloud compute ssl-certificates list) e preencher os campos da seguinte forma:

    Propriedade Valor (introduza um valor ou selecione uma opção conforme especificado)
    Protocolo HTTP(S)
    Nível de serviço de rede Premium
    Versão do IP IPv4
    Endereço IP example-ip
    Porta 443
    Certificado Selecione o certificado www-ssl-cert que criou na secção Configure um recurso de certificado SSL ou crie um novo certificado.
    Opcional: ative o redirecionamento de HTTP para HTTPS Use esta caixa de verificação para ativar os redirecionamentos.

    Selecione esta caixa de verificação para criar um balanceador de carga HTTP parcial adicional que usa o mesmo endereço IP que o seu balanceador de carga HTTPS e redireciona os pedidos HTTP para o frontend HTTPS do seu balanceador de carga.

    Esta caixa de verificação só pode ser selecionada quando o protocolo HTTPS estiver selecionado e for usado um endereço IP reservado.

  3. Clique em Concluído.

Reveja a configuração

  1. Clique em Rever e finalizar.

  2. Reveja o front-end, as regras de anfitriões e caminhos e os contentores de back-end.

  3. Clique em Criar e aguarde que o balanceador de carga seja criado.

  4. Clique no nome do balanceador de carga (http-lb).

  5. Tome nota do endereço IP do equilibrador de carga para a tarefa seguinte. Neste guia, chama-se IP_ADDRESS.

gcloud

Configure o back-end

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

Configure o mapa de URLs

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

Configure o proxy de destino

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

Configure a regra de encaminhamento

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 criar o balanceador de carga, use os seguintes recursos do Terraform.

Configure o back-end

Para criar o back-end, use o 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
}

Configure o mapa de URLs

Para criar o mapa de URLs, use o 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
    }
  }
}

Configure o proxy de destino

Para criar o proxy HTTP de destino, use o 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
}

Configure a regra de encaminhamento

Para criar a regra de encaminhamento, use o 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 alterar o modo para o Application Load Balancer clássico, defina o atributo load_balancing_scheme como "EXTERNAL" em vez de "EXTERNAL_MANAGED".

Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.

Envie tráfego para o seu balanceador de carga

Vários minutos após ter configurado o balanceador de carga, pode começar a enviar tráfego para o endereço IP do balanceador de carga.

Consola

Num navegador de Internet, aceda aos seguintes endereços para testar o equilibrador de carga, substituindo IP_ADDRESS pelo endereço IP do equilibrador de carga:

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

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

Se configurou um balanceador de carga de HTTP, certifique-se de que o navegador não faz o redirecionamento automático para HTTPS.

gcloud

Use o comando curl para testar a resposta dos seguintes URLs. Substitua IP_ADDRESS pelo endereço IPv4 do equilibrador de carga:

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

Parâmetros de string de consulta para a API XML do Cloud Storage

Quando determinados parâmetros de string de consulta são incluídos em pedidos enviados para um contentor de back-end através de um Application Load Balancer, o cliente recebe uma resposta HTTP 404 com um erro "Unsupported query parameter" (Parâmetro de consulta não suportado). Isto acontece porque a API XML do Cloud Storage não suporta estes parâmetros quando o pedido é proveniente de um Application Load Balancer.

A tabela seguinte resume a forma como a API XML do Cloud Storage responde a vários parâmetros de consulta quando os pedidos são encaminhados através de um balanceador de carga de aplicações. Os parâmetros são agrupados por comportamento observado para ajudar a identificar os que são suportados, ignorados ou rejeitados neste contexto.

Tipo de parâmetro Parâmetros Comportamento observado
Parâmetros suportados generation, prefix, marker, max-keys A adição destes parâmetros (com os valores adequados) funciona conforme descrito na documentação da API XML do Cloud Storage. A API devolve uma resposta HTTP padrão.
Parâmetros ignorados acl, billing, compose, delimiter, encryption, encryptionConfig, response-content-disposition, response-content-type, tagging, versions, websiteConfig A adição destes parâmetros não tem qualquer efeito.

Se o equilibrador de carga transmitir estes parâmetros ao Cloud Storage, a API XML do Cloud Storage ignora-os e responde como se os parâmetros não existissem.
Parâmetros rejeitados cors, lifecycle, location, logging, storageClass, versioning A API XML do Cloud Storage devolve um erro "Unsupported query parameter" (Parâmetro de consulta não suportado).

Limitações