Configurar um balanceador de carga de aplicativo externo global com buckets do Cloud Storage

Neste documento, você verá como criar um balanceador de carga de de aplicativo externo a fim de encaminhar solicitações de conteúdo estático para buckets do Cloud Storage. Depois de configurar um balanceador de carga com os buckets de back-end, as solicitações para caminhos de URL que começam com /love-to-fetch são enviadas para o bucket us-east1 do Cloud Storage. Todas as outras solicitações são enviadas para o bucket europe-north1 do Cloud Storage, independentemente da região do usuário.

Caso seus back-ends exibam conteúdo dinâmico por HTTP(S), use serviços de back-end em vez de buckets de back-end.

Se você já for usuário do balanceador de carga clássico do aplicativo, consulte Planejar a migração para o balanceador de carga de aplicativo externo global ao planejar uma nova implantação. com o balanceador de carga de aplicativo externo global.

Como usar buckets do Cloud Storage como back-ends do balanceador de carga

Um balanceador de carga de aplicativo externo usa um mapa de URLs para direcionar o tráfego de caminhos de URL especificados para seus back-ends.

No diagrama a seguir, o balanceador de carga envia tráfego com um caminho de /love-to-fetch/ para um bucket do Cloud Storage na região us-east1. Todas as outras solicitações vão para um bucket do Cloud Storage na região europe-north1.

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

Por padrão, o Cloud Storage usa o mesmo cache que o Cloud CDN. Se você ativar o Cloud CDN no bucket de back-end, será possível usar os controles do Cloud CDN no seu conteúdo. Os controles do Cloud CDN incluem, por exemplo, modos de cache, URLs assinados e invalidação. O Cloud CDN também permite armazenar conteúdo grande em cache (mais de 10 MB). Se você não ativar o Cloud CDN no bucket de back-end, só será possível usar cabeçalhos Cache-Control de origem para controlar o armazenamento em cache de conteúdo menor, conforme definido pelos metadados do Cloud Storage.

Antes de começar

Certifique-se de que sua configuração atenda aos seguintes pré-requisitos. Se você estiver usando o utilitário gcloud storage, instale-o seguindo as instruções em Descobrir o armazenamento de objetos com a ferramenta gcloud.

Configurar um projeto padrão

Console

  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.

    Go to project selector

  3. Make sure 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.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

gcloud

gcloud config set project PROJECT_ID

Substitua PROJECT_ID pelo projeto que você está usando neste guia.

Terraform

export GOOGLE_CLOUD_PROJECT=PROJECT_ID

Permissões

Para seguir este guia, você precisa criar buckets do Cloud Storage e um balanceador de carga em um projeto. É necessário ser proprietário ou editor de um projeto ou ter os seguintes papéis de IAM do Compute Engine:

Tarefa Papel obrigatório
Criar componentes do balanceador de carga Administrador de rede
Criar buckets do Cloud Storage Administrador de objetos do Storage

Para mais informações, consulte estes guias:

Configurar um recurso de certificado SSL

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

Recomendamos o uso de um certificado gerenciado pelo Google.

Este exemplo pressupõe que você já tenha um recurso de certificado SSL chamado www-ssl-cert.

Preparar os conteúdos e buckets do Cloud Storage

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

  • Crie os buckets.

  • Copie conteúdo para os buckets.

  • Forneça acesso público aos buckets.

Criar buckets do Cloud Storage

Neste exemplo, você cria dois buckets do Cloud Storage para o balanceador de carga acessar. Para implantações de produção, recomendamos que você escolha um bucket multirregional que replica objetos automaticamente em várias regiões do Google Cloud. Isso pode melhorar a disponibilidade do seu conteúdo e a tolerância a falhas em todo o aplicativo.

Anote os nomes dos buckets do Cloud Storage criados, porque eles serão usados posteriormente. Neste guia, elas são chamadas de BUCKET_1_NAME e BUCKET_2_NAME.

Console

  1. No console do Google Cloud, acesse a página Buckets do Cloud Storage.

    Acessar buckets do Cloud Storage

  2. Clique em Criar bucket.

  3. Na caixa Nomear seu bucket, digite um nome globalmente exclusivo que siga as diretrizes de nomenclatura.

  4. Clique em Escolha onde armazenar os dados.

  5. Defina o Tipo de local como Região.

  6. Defina Local como europe-north1. Este é o BUCKET_1_NAME neste guia.

  7. Clique em Criar.

  8. Clique em Buckets para retornar à página "Buckets do Cloud Storage". Use estas instruções para criar um segundo bucket, mas defina Localização como us-east1. Este é o 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 buckets que você quer criar.

Terraform

Para criar o serviço de back-end, 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 Comandos básicos do Terraform.

Transferir conteúdo para seus buckets do Cloud Storage

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

gcloud

  1. Clique em Ativar o Cloud Shell.

  2. Execute os comandos a seguir no Cloud Shell, substituindo as variáveis de nome do bucket pelos nomes dos seus buckets 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 bucket, use o 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
}

Se preferir, 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/"
}
}

No console do Google Cloud, clique em Atualizar na página de detalhes de cada bucket para verificar se o arquivo foi copiado.

Deixar seus buckets do Cloud Storage com permissão de leitura pública

Quando você torna os buckets do Cloud Storage publicamente legíveis, qualquer pessoa na Internet pode listar e visualizar seus objetos e visualizar seus metadados (excluindo ACLs). Não inclua informações confidenciais nos buckets 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 bucket.

Console

Para conceder acesso a todos os usuários para visualizar objetos nos seus buckets, repita o procedimento a seguir para cada bucket:

  1. No console do Google Cloud, acesse a página Buckets do Cloud Storage.

    Acessar buckets do Cloud Storage

  2. Clique no nome do bucket e depois na guia Permissões.

  3. Clique em Adicionar.

  4. Na caixa Novos principais, digite allUsers.

  5. Na caixa Selecionar um papel, selecione Cloud Storage > Leitor de objetos do Storage.

  6. Clique em Salvar.

  7. Clique em Permitir acesso público.

gcloud

Para conceder a todos os usuários acesso para visualizar objetos nos seus buckets, 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 usuários acesso para visualizar objetos nos seus buckets, use o recurso google_storage_bucket_iam_member e especifique o membro 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 um endereço IP externo

Depois de configurar os buckets do Cloud Storage, é possível reservar um endereço IP externo estático global que o público-alvo use para alcançar seu balanceador de carga.

Essa etapa é opcional, mas recomendada, porque um endereço IP externo e estático fornece um único endereço para apontar ao domínio.

Console

  1. No console do Google Cloud, acesse a página Endereços IP externos.

    Acessar Endereços IP externos

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

  3. Na caixa Nome, digite example-ip.

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

  5. Defina Versão IP como IPv4.

  6. Defina Tipo como Global.

  7. Clique em Reservar.

gcloud

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

Anote o 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"
}

Criar um balanceador de carga de aplicativo externo com buckets 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, é necessário adicionar um recurso de certificado SSL ao front-end do balanceador de carga. Para mais informações, consulte a visão geral dos certificados SSL.

Console

Iniciar a configuração

  1. No console do Google Cloud, acesse a página Balanceamento de carga.

    Acessar o "Balanceamento de carga"

  2. Clique em Criar balanceador de carga.
  3. Em Tipo de balanceador de carga, selecione Balanceador de carga de aplicativo (HTTP/HTTPS) e clique em Próxima.
  4. Em Voltado ao público ou interno, selecione Voltado ao público (externo) e clique em Próxima.
  5. Em Implantação global ou de região única, selecione Melhor para cargas de trabalho globais e clique em Próxima.
  6. Em Geração do balanceador de carga, selecione Balanceador de carga de aplicativo externo global e clique em Próxima.
  7. Clique em Configurar.

Configuração básica

  1. Na caixa Nome, digite http-lb.

Configurar o back-end

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

  2. Clique na caixa Serviços e buckets de back-end e depois em em Criar um bucket de back-end.

  3. Na caixa Nome do bucket de back-end, insira cats.

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

  5. Selecione BUCKET_1_NAME e clique em Selecionar. A criação do bucket de back-end cats primeiro o torna padrão, para onde todas as solicitações de tráfego sem correspondência são direcionadas. Não é possível alterar as regras de redirecionamento de um bucket de back-end padrão no balanceador de carga.

  6. Clique em Criar.

  7. Use o mesmo processo para criar um bucket de back-end chamado dogs e selecione BUCKET_2_NAME.

  8. Clique em OK.

Configurar regras de roteamento

As regras de roteamento determinam como o tráfego é direcionado. Para configurar o roteamento, defina as regras de host e os correspondentes de caminho, que são componentes de configuração do mapa de URLs de um balanceador de carga de aplicativo externo. Para configurar as regras deste exemplo:

  1. Clique em Regras de roteamento.
  2. Para dogs, insira * no campo Hosts e /love-to-fetch/* no campo Caminhos.

Configure o front-end

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

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

    Propriedade Valor: digite um valor ou selecione uma opção conforme especificado
    Protocolo HTTP
    Nível de serviço da rede Premium
    Versão IP IPv4
    Endereço IP example-ip
    Porta 80
    Opcional: tempo limite do sinal de atividade HTTP Insira um valor de tempo limite de 5 a 1.200 segundos. O valor padrão é de 610 segundos.

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

    Propriedade Valor: digite um valor ou selecione uma opção conforme especificado
    Protocolo HTTP(S)
    Nível de serviço da rede Premium
    Versão IP IPv4
    Endereço IP example-ip
    Porta 443
    Opcional: tempo limite do sinal de atividade HTTP Insira um valor de tempo limite de 5 a 1.200 segundos. O valor padrão é de 610 segundos.
    Certificado Selecione o certificado www-ssl-cert que você criou na seção Configurar um recurso de certificado SSL ou crie um novo certificado.
    Opcional: ativar o redirecionamento de HTTP para HTTPS Use essa caixa de seleção para ativar os redirecionamentos.

    Ativar esta caixa de seleção cria um balanceador de carga HTTP parcial que utiliza o mesmo endereço IP que o balanceador de carga HTTPS e redireciona solicitações HTTP para o front-end HTTPS do balanceador de carga.

    Essa caixa de seleção poderá ser marcada somente quando o protocolo HTTPS estiver selecionado e um endereço IP reservado for utilizado.

  3. Clique em Concluído.

Analise a configuração

  1. Clique em Analisar e finalizar.

  2. Verifique o Front-end, as Regras de host e caminho e os buckets de back-end.

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

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

  5. Anote o endereço IP do balanceador de carga para a próxima tarefa. Neste guia, ele é chamado de IP_ADDRESS.

gcloud

Configurar 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

Configurar o 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

Configurar o proxy de destino

gcloud compute target-http-proxies create http-lb-proxy \
  --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
  --url-map=http-lb

Substitua HTTP_KEEP_ALIVE_TIMEOUT_SEC pelo valor do tempo limite do sinal de atividade HTTP do cliente de 5 a 1.200 segundos. O valor padrão é de 610 segundos. Este campo é opcional.

Configurar a regra de encaminhamento

gcloud compute forwarding-rules create http-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --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 serviço de 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
}

Configurar o mapa de URL

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

Configurar 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
}

Configurar 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
}

OBSERVAÇÃO: para alterar o modo para o balanceador de carga clássico do aplicativo, 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 Comandos básicos do Terraform.

Enviar tráfego para o balanceador de carga

Alguns minutos após a configuração do balanceador de carga, é possível começar a enviar tráfego para o endereço IP dele.

Console

O Console do Google Cloud não é suportado.

gcloud

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

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

Configurações avançadas

Nesta seção, o exemplo é detalhado para fornecer outras opções de configuração. Todas as tarefas são opcionais. É possível realizá-las em qualquer ordem.

Atualizar tempo limite do sinal de atividade HTTP do cliente

O balanceador de carga criado nas etapas anteriores foi configurado com um valor padrão para o tempo limite do sinal de atividade HTTP do cliente. Para atualizar o tempo limite do sinal de atividade HTTP do cliente, use as instruções a seguir.

Console

  1. No Console do Google Cloud, acesse a página Balanceamento de carga.

    Acessar o "Balanceamento de carga"

  2. Clique no nome do balanceador de carga que você quer modificar.
  3. Clique em Editar.
  4. Clique em Configuração de front-end.
  5. Expanda Recursos avançados. Em Tempo limite de sinal de atividade HTTP, insira um valor de tempo limite entre 5 e 1.200 segundos.
  6. Clique em Atualizar.
  7. Para revisar as alterações, clique em Analisar e finalizar e depois em Atualizar.

gcloud

Para um balanceador de carga HTTP, atualize o proxy HTTP de destino usando o comando gcloud compute target-http-proxies update:

    gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

Para um balanceador de carga HTTPS, atualize o proxy HTTPS de destino usando o comando gcloud compute target-https-proxies update:

    gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

Substitua:

  • TARGET_HTTP_PROXY_NAME: o nome do proxy HTTP de destino.
  • TARGET_HTTPS_PROXY_NAME: o nome do proxy HTTPS de destino.
  • HTTP_KEEP_ALIVE_TIMEOUT_SEC: o tempo limite do sinal de atividade HTTP de 5 a 1.200 segundos.

Limitações

  • Os buckets de back-end são compatíveis apenas com balanceadores de carga de aplicativo externos globais e o balanceador de carga de aplicativo clássico. Eles não são compatíveis com o balanceador de carga de aplicativo externo regional ou qualquer outro tipo de balanceador de carga.
  • Os buckets de back-end não são compatíveis com o Identity-Aware Proxy.
  • O balanceador de carga de aplicativo externo global não é compatível com uploads para buckets do Cloud Storage.

A seguir