Como configurar um redirecionamento HTTP a HTTPS para balanceamento de carga HTTP(S)

O foco desta página são os redirecionamentos HTTP-HTTPS. Para informações sobre outros tipos de redirecionamentos, consulte Redirecionamentos de URL.

Para configurar um redirecionamento de HTTP para HTTPS usando o Terraform, consulte a guia de redirecionamento de HTTP para HTTPS na página de exemplos do módulo para balanceadores de carga HTTP(S) externos.

Neste exemplo, você verá como redirecionar todas as solicitações da porta 80 para a porta 443.

Em geral, para redirecionar o tráfego HTTP para HTTPS, é preciso seguir as etapas a seguir:

  1. Crie o LB1 HTTPS (chamado aqui de web-map-https).
  2. Teste o LB1.
  3. Crie o LB2 HTTP (sem back-end) (chamado web-map-http) com o mesmo endereço IP usado no LB1 e um redirecionamento configurado no mapa de URL.
  4. Teste o redirecionamento.

Conforme mostrado no diagrama a seguir, o LB1 é um balanceador de carga HTTPS normal com os componentes do balanceador de carga esperados.

O LB2 é um balanceador de carga HTTP com o mesmo endereço IP usado no LB1, uma instrução de redirecionamento no mapa de URL e nenhum back-end.

Configuração de redirecionamento de HTTP para HTTPS (clique para ampliar)
Configuração de redirecionamento de HTTP para HTTPS

Para saber como configurar o redirecionamento HTTP-HTTPS para balanceamento de carga interno, consulte Como configurar o redirecionamento HTTP-HTTPS para balanceadores de carga HTTP(S) internos.

Como configurar um balanceador de carga HTTPS básico (LB1)

Neste exemplo, você verá como configurar e testar um balanceador de carga HTTPS.

Neste guia de configuração, você verá como criar um balanceador de carga HTTP(S) externo e um back-end do Compute Engine com estes recursos:

Se esse exemplo não corresponder ao caso de uso em questão, consulte uma destas páginas:

Para conceitos gerais, consulte a Visão geral do balanceamento de carga HTTP(S) externo.

Topologias do balanceador de carga

Para um balanceador de carga HTTPS, crie a configuração ilustrada no diagrama a seguir.

Balanceador de carga HTTPS com um back-end do Compute Engine (clique para ampliar)
Balanceador de carga HTTPS com um back-end do Compute Engine (clique para ampliar)

Para um balanceador de carga HTTP, crie a configuração ilustrada no diagrama a seguir.

Balanceador de carga HTTP com um back-end do Compute Engine (clique para ampliar)
Balanceador de carga HTTP com um back-end do Compute Engine (clique para ampliar)

A sequência de eventos nos diagramas é a seguinte:

  1. Um cliente envia uma solicitação de conteúdo para o endereço IPv4 externo definido na regra de encaminhamento.
  2. Para um balanceador de carga HTTPS, a regra de encaminhamento direciona a solicitação para o proxy HTTPS de destino.

    Para um balanceador de carga HTTP, a regra de encaminhamento direciona a solicitação para o proxy HTTP de destino.

  3. O proxy de destino usa a regra no mapa de URLs para determinar que o único serviço de back-end receba todas as solicitações.

  4. O balanceador de carga determina que o serviço de back-end tenha apenas um grupo de instâncias e direciona a solicitação para uma instância de máquina virtual (VM) nesse grupo.

  5. A VM exibe o conteúdo solicitado pelo usuário.

Antes de começar

Certifique-se de que sua configuração atenda aos pré-requisitos.

Configurar um recurso de certificado SSL

Para um balanceador de carga HTTPS, crie um recurso de certificado SSL, conforme descrito 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.

Configurar permissões

Para concluir as etapas neste guia, é preciso ter permissão para criar instâncias do Compute Engine, regras de firewall e endereços IP reservados em um projeto. Você precisa ter um papel de proprietário ou editor do projeto ou os seguintes papéis do IAM do Compute Engine.

Tarefa Papel necessário
Criar instâncias Administrador de instâncias
Adicionar e remover regras de firewall Administrador de segurança
Criar componentes do balanceador de carga Administrador de rede
Criar um projeto (opcional) Criador do projeto

Para mais informações, consulte estes guias:

Como criar um grupo de instâncias gerenciadas

Para configurar um balanceador de carga com um back-end do Compute Engine, suas VMs precisam estar em um grupo de instâncias. Neste guia, descrevemos como criar um grupo de instâncias gerenciadas usando VMs do Linux com o Apache em execução para, em seguida, configurar o balanceamento.

O grupo gerenciado de instâncias fornece VMs que executam os servidores de back-end de um balanceador de carga HTTP(S) externo. Para fins de demonstração, os back-ends exibem os próprios nomes de host.

Console

  1. No Console do Google Cloud, acesse a página Grupos de instâncias.

    Acessar a página "Grupos de instâncias"

  2. Clique em Criar grupo de instâncias.
  3. À esquerda, escolha Novo grupo de instâncias gerenciadas.
  4. Em Nome, insira lb-backend-example.
  5. Em Local, selecione Única zona.
  6. Em Região, selecione a região de sua preferência. O exemplo usa us-east1.
  7. Em Zona, selecione us-east1-b.
  8. Em Modelo de instância, selecione Criar um novo modelo de instância.
  9. Em Nome, insira lb-backend-template.
  10. Certifique-se de que o disco de inicialização esteja configurado como uma imagem Debian. Por exemplo, Debian GNU/Linux 9 (stretch). Estas instruções usam comandos que estão disponíveis apenas no Debian, como apt-get.
  11. Não configure a opção Firewall.

    Como o balanceador de carga HTTP(S) externo é um proxy, não é necessário selecionar Permitir tráfego HTTPS ou Permitir tráfego HTTP em Firewall. Em Como configurar uma regra de firewall, crie a única regra de firewall necessária para esse balanceador de carga.

  12. Na guia Gerenciamento, insira o seguinte script no campo Script de inicialização em Gerenciamento, segurança, discos, rede, locatário único.

    #! /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
    
  13. Na guia Rede, adicione as tags de rede: allow-health-check

  14. Clique em Salvar e continuar.

  15. Em Modo de escalonamento automático, selecione Não fazer escalonamento automático.

  16. Em Número de instâncias, insira 2.

  17. Para criar o novo grupo de instâncias, clique em Criar.

gcloud

  1. Crie o modelo.

    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. Crie o grupo gerenciado de instâncias com base no modelo.

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

Como adicionar uma porta nomeada ao grupo de instâncias

Para o grupo de instâncias, defina um serviço HTTP e associe um nome à porta relevante. Após a configuração do serviço de balanceamento de carga, o tráfego é encaminhado à porta nomeada.

Console

  1. No Console do Google Cloud, acesse a página Grupos de instâncias.

    Acessar a página "Grupos de instâncias"

  2. Clique no nome do grupo de instâncias (neste exemplo, lb-backend-example).
  3. Na página Visão geral do grupo de instâncias, clique em Editar .
  4. Clique em Especificar mapeamento de nomes de porta.
  5. Clique em Adicionar item.
  6. Para o nome da porta, insira http. Para o número da porta, insira 80.
  7. Clique em Salvar.

gcloud

Use o comando gcloud compute instance-groups set-named-ports.

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

Como configurar uma regra de firewall

Neste exemplo, você criará a regra de firewall fw-allow-health-check. Essa é uma regra de entrada que permite o tráfego dos sistemas de verificação de integridade do Google Cloud (130.211.0.0/22 e 35.191.0.0/16). Este exemplo usa a tag de destino allow-health-check para identificar as VMs.

Console

  1. No Console do Google Cloud, acesse a página Firewall.

    Acesse a página "Firewall"

  2. Clique em Criar regra de firewall para gerar a segunda regra.
  3. Em Nome, insira fw-allow-health-check.
  4. Em Rede, selecione Default.
  5. Em Destinos, selecione Tags de destino especificadas.
  6. Preencha o campo Tags de destino com allow-health-check.
  7. Defina Filtro de origem como Intervalos de IP.
  8. Defina Intervalos IP de origem como 130.211.0.0/22 e 35.191.0.0/16.
  9. Em Protocolos e portas, selecione Portas e protocolos especificados.
  10. Marque a caixa de seleção tcp e digite 80 para os números de porta.
  11. Clique em Criar.

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:80

Como reservar um endereço IP externo

Agora que suas instâncias estão funcionando, configure um endereço IP externo, estático e global que seus clientes possam usar para alcançar seu balanceador de carga.

Console

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

    Acessar a página "Endereços IP externos"

  2. Para reservar um endereço IPv4, clique em Reservar endereço estático.
  3. Em Nome, insira lb-ipv4-1.
  4. Defina Nível de serviço de rede como Premium.
  5. Configure Versão IP como IPv4.
  6. Defina Tipo como Global.
  7. Clique em Reservar.

gcloud

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

Anote o endereço IPv4 que foi reservado:

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

Configurar o balanceador de carga

Neste exemplo, você está usando HTTP ou HTTPS entre o cliente e o balanceador de carga. Para HTTPS, você precisa de um ou mais recursos de certificado SSL para configurar o proxy. Recomendamos o uso de um certificado gerenciado pelo Google.

Mesmo se você estiver usando HTTPS no front-end, poderá usar HTTP no back-end. O Google criptografa automaticamente o tráfego entre os Google Front Ends (GFEs) e seus back-ends que residem em redes VPC do Google Cloud.

Console

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

    Acessar a página "Balanceamento de carga"

  2. Clique em Criar balanceador de carga.
  3. Em Balanceamento de carga HTTP(S), clique em Iniciar configuração.
  4. Selecione Da Internet para minhas VMs e clique em Continuar.
  5. No campo Nome do balanceador de carga, insira algo como web-map-https ou web-map-http.
  6. Clique em Configuração de back-end.
    1. Em Criar ou selecionar serviços e buckets de back-end, selecione Serviços de back-end > Criar um serviço de back-end.
    2. Adicione um nome para o serviço de back-end, como web-backend-service.
    3. Em Protocolo, selecione HTTP.
    4. Em Porta nomeada, insira http.
    5. Em Back-ends > Novo back-end > Grupo de instâncias, selecione o grupo de instâncias, lb-backend-example.
    6. Em Número da porta, insira 80.
    7. Mantenha as outras configurações padrão.
    8. Em Verificação de integridade, selecione Criar uma verificação de integridade e adicione um nome para ela, como http-basic-check.
    9. Defina o protocolo como HTTP e clique em Salvar e continuar.
    10. Mantenha as outras configurações padrão.
    11. Clique em Criar.
  7. Em Regras de host e caminho, mantenha as configurações padrão.
  8. Em Configuração de front-end, use os seguintes valores:
    1. Defina Protocolo como HTTPS ou HTTP.
    2. Defina o endereço IP como lb-ipv4-1, que você criou antes.
    3. Verifique se Porta está definida como 443 para permitir tráfego HTTPS ou 80 para tráfego HTTP.
    4. Se você selecionou 443, clique na lista suspensa Certificado e selecione o certificado SSL principal.
    5. Clique em Concluído.
  9. Clique em Analisar e finalizar.
  10. Quando terminar de configurar o balanceador de carga, clique em Criar.
  11. Aguarde o balanceador de carga ser criado.
  12. Clique no nome do balanceador de carga.
  13. Na tela Detalhes do balanceador de carga, anote o IP:Porta do balanceador de carga.

gcloud

  1. Crie uma verificação de integridade.
    gcloud compute health-checks create http http-basic-check \
        --port 80
    
  2. Crie um serviço de back-end.
    gcloud compute backend-services create web-backend-service \
        --protocol=HTTP \
        --port-name=http \
        --health-checks=http-basic-check \
        --global
    
  3. Inclua seu grupo de instâncias como back-end do serviço de back-end.
    gcloud compute backend-services add-backend web-backend-service \
        --instance-group=lb-backend-example \
        --instance-group-zone=us-east1-b \
        --global
    

Como configurar um front-end HTTPS

Pule esta seção para balanceadores de carga HTTP.

  1. Para HTTPS, crie um mapa de URLs para encaminhar as solicitações recebidas para o serviço de back-end padrão.
    gcloud compute url-maps create web-map-https \
        --default-service web-backend-service
    
  2. Para HTTPS, crie o recurso de certificado SSL global, caso ainda não tenha feito isso, conforme mostrado em:

    O exemplo a seguir pressupõe que você já tem um arquivo de certificado chamado certificate-file e um arquivo de chave privada chamado private-key-file. O exemplo cria um recurso de certificado SSL chamado www-ssl-cert.

    gcloud compute ssl-certificates create www-ssl-cert \
        --certificate=certificate-file \
        --private-key=private-key-file \
        --global
    
  3. Para HTTPS, crie um proxy HTTPS de destino para encaminhar solicitações ao mapa de URL. O proxy é a parte do balanceador de carga onde é armazenado o certificado SSL de balanceamento de carga HTTPS. Portanto, carregue também seu certificado nesta etapa.
    gcloud compute target-https-proxies create https-lb-proxy \
        --url-map=web-map-https \
        --ssl-certificates=www-ssl-cert
    
  4. Para HTTPS, crie uma regra de encaminhamento global para encaminhar as solicitações recebidas para o proxy.
    gcloud compute forwarding-rules create https-content-rule \
        --address=lb-ipv4-1 \
        --global \
        --target-https-proxy=https-lb-proxy \
        --ports=443
    

Como configurar um front-end HTTP

Pule esta seção para balanceadores de carga HTTPS.

  1. Para HTTP, crie um mapa de URLs para encaminhar as solicitações recebidas para o serviço de back-end padrão.
    gcloud compute url-maps create web-map-http \
        --default-service web-backend-service
    
  2. Para HTTP, crie um proxy HTTP de destino para encaminhar solicitações ao mapa de URLs.
    gcloud compute target-http-proxies create http-lb-proxy \
        --url-map=web-map-http
    
  3. Para HTTP, crie uma regra de encaminhamento global para encaminhar as solicitações recebidas para o proxy.
    gcloud compute forwarding-rules create http-content-rule \
        --address=lb-ipv4-1 \
        --global \
        --target-http-proxy=http-lb-proxy \
        --ports=80
    

Como testar o tráfego enviado às instâncias

Agora que o serviço de balanceamento de carga está em execução, é possível enviar o tráfego para a regra de encaminhamento e observar como ele será distribuído em várias instâncias.

Console

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

    Acessar a página "Balanceamento de carga"

  2. Clique no balanceador de carga que você acabou de criar.
  3. Na seção Back-end, confirme se as VMs estão íntegras. A coluna Integridade deve estar preenchida, indicando que ambas as VMs estão íntegras (2/2). Caso contrário, primeiro tente recarregar a página. Pode levar alguns instantes para o Console do Cloud indicar que as VMs estão íntegras. Se os back-ends não aparecerem íntegros depois de alguns minutos, revise a configuração do firewall e a tag de rede atribuída às suas VMs de back-end.
  4. No caso de HTTPS, se você usa um certificado gerenciado pelo Google, confirme se o status do recurso do certificado é "ATIVO". Para mais informações, consulte Status do recurso de certificado SSL gerenciado pelo Google.
  5. Depois que o Console do Cloud mostrar que as instâncias de back-end estão íntegras, teste o balanceador de carga com um navegador da Web acessando https://IP_ADDRESS (ou http://IP_ADDRESS). Substitua IP_ADDRESS pelo endereço IP do balanceador de carga.
  6. Caso você tenha usado um certificado autoassinado durante o teste de HTTPS, o navegador exibirá um aviso. É preciso conceder permissão explícita para que seu navegador aceite um certificado autoassinado.
  7. Seu navegador deve renderizar uma página que mostre o nome da instância que a exibiu e a zona (por exemplo, Page served from: lb-backend-example-xxxx). Caso seu navegador não renderize essa página, revise as configurações mostradas neste guia.

Quando você terminar, o Console do Cloud exibirá informações sobre o balanceador de carga HTTPS da seguinte maneira.

Balanceador de carga HTTPS

Como redirecionar o tráfego para o balanceador de carga HTTPS

Agora que você criou o LB1 e verificou que ele está funcionando, crie o LB2 (um balanceador de carga HTTP parcial sem back-end) para redirecionar o tráfego HTTP para o LB1.

Neste exemplo, usamos o código de resposta 301. Em vez disso, é possível usar um código de resposta diferente.

Para configurar o redirecionamento, importe um arquivo YAML e verifique se o proxy HTTP de destino aponta para o mapa de URL que redireciona o tráfego.

Console

No momento, esse recurso não é compatível com o Console do Google Cloud.

gcloud

  1. Crie um arquivo YAML /tmp/web-map-http.yaml. Este exemplo usa MOVED_PERMANENTLY_DEFAULT como código de resposta.

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
       redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
       httpsRedirect: True
    tests:
    - description: Test with no query parameters
      host: foobar
      path: /test/
      expectedOutputUrl: https://foobar/test/
      expectedRedirectResponseCode: 301
    - description: Test with query parameters
      host: foobar
      path: /test/?parameter1=value1&parameter2=value2
      expectedOutputUrl: https://foobar/test/?parameter1=value1&parameter2=value2
      expectedRedirectResponseCode: 301
    
  2. Valide o mapa de URL.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Se os testes forem aprovados e o comando resultar em uma mensagem de êxito, salve as alterações no mapa de URL.

  3. Crie o mapa de URL do balanceador de carga HTTP importando o arquivo YAML. O nome desse mapa de URL é web-map-http.

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

    Se você estiver atualizando um mapa de URL existente, o seguinte prompt será exibido:

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

    Para continuar, pressione Y.

  4. Verifique se o mapa de URLs está atualizado. O mapa de URLs do balanceador de carga HTTP deve ter esta aparência:

    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
    
  5. Crie um novo proxy HTTP de destino ou atualize um proxy HTTP de destino existente, usando web-map-http como o mapa de URL.

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

    OU

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  6. Crie uma regra de encaminhamento global para encaminhar as solicitações recebidas para o proxy. A sinalização --address especifica lb-ipv4-1, que é o mesmo endereço IP usado para o balanceador de carga HTTPS externo.

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

Quando você terminar, o Console do Cloud exibirá dois balanceadores de carga, conforme mostrado a seguir.

Ambos os balanceadores de carga

O Console do Cloud exibe informações sobre o balanceador de carga web-map-http da seguinte maneira.

Balanceador de carga HTTP

Como adicionar um cabeçalho personalizado

É possível adicionar o cabeçalho HTTP Strict-Transport-Security ao serviço de back-end do balanceador de carga HTTPS da seguinte maneira:

  • Nome do cabeçalho: Strict-Transport-Security
  • Valor do cabeçalho: max-age=31536000; includeSubDomains; preload

Essa configuração envia o cabeçalho personalizado ao cliente. Assim, na próxima vez que ele tentar acessar o URL usando o HTTP, o navegador fará o redirecionamento.

Para adicionar o cabeçalho personalizado à configuração do serviço de back-end, use a sinalização --custom-response-header, conforme mostrado aqui:

gcloud compute backend-services update web-backend-service \
    --global \
    --custom-response-header='Strict-Transport-Security:max-age=31536000; includeSubDomains; preload'

Para mais informações, consulte Como criar cabeçalhos personalizados.

Como testar o redirecionamento de HTTP para HTTPS

Anote o endereço IP reservado que você está usando nos dois balanceadores de carga.

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

Neste exemplo, suponha que o endereço IP reservado é 34.98.77.106. O URL http://34.98.77.106/ redireciona para https://34.98.77.106/.

Depois de alguns minutos, teste isso executando o comando curl a seguir. Não esqueça de substituir 34.98.77.106 pelo endereço IP reservado.

curl 34.98.77.106:80

Exemplo de saída:

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

A seguir