Publicar tráfego de várias regiões

Devolve respostas mais rápidas aos seus utilizadores em todo o mundo implementando serviços em várias regiões e encaminhando os seus utilizadores para a região mais próxima. A implementação em várias regiões oferece baixa latência e maior disponibilidade em caso de interrupções regionais.

Uma vez que os serviços do Cloud Run são implementados em regiões individuais, tem de implementar o seu serviço em várias regiões e, em seguida, configurar o balanceamento de carga global para o serviço.

Implemente o serviço em várias regiões

Pode implementar o mesmo serviço em várias regiões através de um dos seguintes métodos:

Implemente um serviço multirregião

Esta secção mostra como implementar e configurar um serviço de várias regiões a partir de um único comando da CLI gcloud ou de um ficheiro YAML.

gcloud

  • Para criar e implementar um serviço de várias regiões, execute o comando gcloud beta run deploy com a flag --regions:

    gcloud beta run deploy SERVICE_NAME \
      --image=IMAGE_URL \
      --regions=REGIONS

    Substitua o seguinte:

    • SERVICE_NAME: o nome do serviço multirregional que quer implementar.
    • IMAGE_URL: uma referência à imagem do contentor, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest.
    • REGIONS: a lista de várias regiões para as quais quer fazer a implementação. Por exemplo, europe-west1,asia-east1.

YAML

  1. Crie o ficheiro YAML para o seu serviço, usando o atributo run.googleapis.com/regions para definir as várias regiões nas quais quer implementar o seu serviço:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/regions: REGIONS
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL

    Substitua o seguinte:

    • SERVICE_NAME: O nome do serviço multirregião para o qual quer implementar.
    • REGIONS: a lista de várias regiões que quer atualizar. Por exemplo, europe-west1,asia-east1.
    • IMAGE_URL: uma referência à imagem do contentor, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest.
  2. Crie o serviço com o seguinte comando:

    gcloud beta run multi-region-services replace service.yaml

Atualize um serviço multirregião

Esta secção mostra como adicionar ou remover regiões de um serviço com várias regiões a partir de um único comando da CLI gcloud ou de um ficheiro YAML.

gcloud

Para adicionar ou remover regiões de um serviço multirregião, execute o comando gcloud beta run multi-region-services update.

  • Para adicionar o serviço multirregional a uma ou mais regiões adicionais, use a flag --add-regions:

    gcloud beta run multi-region-services update SERVICE_NAME \
      --add-regions=REGIONS
  • Para remover o serviço multirregional de uma ou mais regiões, use a flag --remove-regions:

    gcloud beta run multi-region-services update SERVICE_NAME \
      --remove-regions=REGIONS

    Substitua o seguinte:

    • SERVICE_NAME: o nome do serviço multirregional que quer atualizar.
    • REGIONS: a região ou as regiões às quais quer adicionar o seu serviço ou das quais quer remover o seu serviço. Por exemplo, europe-west1,asia-east1.

YAML

  1. Para atualizar um serviço multirregião existente, transfira a respetiva configuração YAML:

    gcloud beta run multi-region-services describe SERVICE_NAME --format export > service.yaml
  2. Atualize o atributo run.googleapis.com/regions para adicionar ou remover a lista de regiões para as quais quer implementar o serviço:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/regions: REGIONS

    Substitua o seguinte:

    • SERVICE_NAME: O nome do serviço multirregião para o qual quer implementar.
    • REGIONS: a nova lista de várias regiões para as quais quer implementar a revisão do serviço.
  3. Atualize o serviço com o seguinte comando:

    gcloud beta run multi-region-services replace service.yaml

Elimine um serviço multirregião

  • Para eliminar um serviço de várias regiões, execute o comando gcloud beta run multi-region-services delete:

    gcloud beta run multi-region-services delete SERVICE_NAME

    Substitua SERVICE_NAME pelo nome do serviço de várias regiões que quer eliminar.

Configure o balanceamento de carga global

Esta secção mostra como configurar um Application Load Balancer externo com um domínio protegido com um certificado TLS gerido que aponta para um endereço IP anycast global, que encaminha os utilizadores para o centro de dados da Google mais próximo que implementa o seu serviço.

A arquitetura descrita nas secções seguintes não encaminha automaticamente os pedidos para uma região diferente quando um serviço do Cloud Run regional deixa de responder ou devolve erros. Para aumentar a disponibilidade do seu serviço multirregional, pode configurar a deteção de valores atípicos para identificar serviços do Cloud Run não íntegros com base na respetiva taxa de erros HTTP e desviar alguns pedidos para outra região.

Crie um balanceador de carga

A criação de um Application Load Balancer externo envolve a criação de vários recursos de rede e a respetiva ligação:

CLI gcloud

  1. Reserve um endereço IP estático para não ter de atualizar os registos de DNS quando recriar o balanceador de carga.
    gcloud compute addresses create --global SERVICE_IP
    No comando acima, substitua SERVICE_IP por um nome para o recurso de endereço IP (por exemplo, myservice-ip).

    Este endereço IP é um endereço IPv4 anycast global que encaminha para o centro de dados ou o ponto de presença da Google mais próximo dos seus visitantes.

  2. Crie um serviço de back-end.
    gcloud compute backend-services create --global BACKEND_NAME

    No comando acima, substitua BACKEND_NAME por um nome que quer atribuir ao serviço de back-end (por exemplo, myservice-backend).

  3. Crie um mapa de URLs.
    gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

    Substitua URLMAP_NAME por um nome que quer dar ao mapa de URLs (por exemplo, myservice-urlmap).

  4. Crie um certificado TLS gerido para o seu domínio para apresentar tráfego HTTPS. (Substitua example.com pelo nome do seu domínio.)
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=example.com

    Substitua CERT_NAME pelo nome que quer que o certificado SSL gerido tenha (por exemplo, myservice-cert).

  5. Crie um proxy HTTPS de destino.
    gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
      --ssl-certificates=CERT_NAME \
      --url-map=URLMAP_NAME

    Substitua HTTPS_PROXY_NAME pelo nome que quer dar ao proxy HTTPS de destino (por exemplo, myservice-https).

  6. Crie uma regra de encaminhamento que associe os recursos de rede que criou ao endereço IP.
    gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
      --target-https-proxy=HTTPS_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=443

    Substitua FORWARDING_RULE_NAME pelo nome do recurso da regra de encaminhamento que quer criar (por exemplo, myservice-lb).

Terraform

Em alternativa aos passos descritos nesta secção, pode usar o módulo Terraform do balanceador de carga HTTP global.

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

  1. Configure o endereço IP:

    resource "google_compute_global_address" "lb_default" {
      provider = google-beta
      name     = "myservice-service-ip"
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api
      ]
    }
    output "load_balancer_ip_addr" {
      value = google_compute_global_address.lb_default.address
    }

    Configura o nome do recurso do endereço IP como myservice-service-ip. Pode alterar este valor para o seu próprio valor. Este endereço IP é um endereço IPv4 anycast global que encaminha para o centro de dados ou o ponto de presença da Google mais próximo dos seus visitantes.

  2. Crie e configure o serviço de back-end:

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

    Este recurso configura o serviço de back-end para ter o nome myservice-backend. Pode alterar este valor para o seu próprio valor.

  3. Configure o mapa de URLs:

    resource "google_compute_url_map" "lb_default" {
      provider        = google-beta
      name            = "myservice-lb-urlmap"
      default_service = google_compute_backend_service.lb_default.id
    
      path_matcher {
        name            = "allpaths"
        default_service = google_compute_backend_service.lb_default.id
        route_rules {
          priority = 1
          url_redirect {
            https_redirect         = true
            redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
          }
        }
      }
    }

    Associa o recurso do serviço de back-end (myservice-backend) ao novo recurso do mapa de URLs (myservice-lb-urlmap). Pode alterar estes valores para os seus próprios valores.

  4. Crie um certificado TLS gerido para o seu domínio para apresentar tráfego HTTPS. Substitua example.com pelo nome do seu domínio no recurso google_compute_managed_ssl_certificate:

    resource "google_compute_managed_ssl_certificate" "lb_default" {
      provider = google-beta
      name     = "myservice-ssl-cert"
    
      managed {
        domains = ["example.com"]
      }
    }
  5. Configure o proxy HTTPS:

    resource "google_compute_target_https_proxy" "lb_default" {
      provider = google-beta
      name     = "myservice-https-proxy"
      url_map  = google_compute_url_map.lb_default.id
      ssl_certificates = [
        google_compute_managed_ssl_certificate.lb_default.name
      ]
      depends_on = [
        google_compute_managed_ssl_certificate.lb_default
      ]
    }

    Cria um recurso google_compute_target_https_proxy com o nome de destino myservice-https-proxy e associa o certificado TLS (myservice-ssl-cert) e os recursos de mapeamento de URLs (myservice-lb-urlmap) criados anteriormente. Pode alterar estes valores para os seus próprios valores.

  6. Configure a regra de encaminhamento:

    resource "google_compute_global_forwarding_rule" "lb_default" {
      provider              = google-beta
      name                  = "myservice-lb-fr"
      load_balancing_scheme = "EXTERNAL_MANAGED"
      target                = google_compute_target_https_proxy.lb_default.id
      ip_address            = google_compute_global_address.lb_default.id
      port_range            = "443"
      depends_on            = [google_compute_target_https_proxy.lb_default]
    }

    Cria o recurso google_compute_global_forwarding_rule com o nome de destino myservice-https-proxy e associa o destino do proxy HTTPS criado anteriormente (myservice-https-proxy) e o recurso de endereço IP (myservice-service-ip). Pode alterar estes valores para os seus próprios valores.

  7. Aplicar esta configuração:

    Para aplicar a configuração do Terraform num Google Cloud projeto, conclua os passos nas secções seguintes.

    Prepare o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o Google Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

      Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

    Prepare o diretório

    Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

    1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

      Copie o exemplo de código para o ficheiro main.tf criado recentemente.

      Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

    3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
    4. Guarde as alterações.
    5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
      terraform init

      Opcionalmente, para usar a versão mais recente do fornecedor Google, inclua a opção -upgrade:

      terraform init -upgrade

    Aplique as alterações

    1. Reveja a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expetativas:
      terraform plan

      Faça as correções necessárias à configuração.

    2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
      terraform apply

      Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

    3. Abra o seu Google Cloud projeto para ver os resultados. Na Google Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

Configure grupos de pontos finais de rede regionais

Para cada região na qual fez a implementação no passo anterior, tem de criar grupos de pontos finais de rede (NEGs) sem servidor e adicioná-los ao serviço de back-end através das seguintes instruções:

CLI gcloud

  1. Crie um grupo de pontos finais de rede para o serviço do Cloud Run em REGION:

    gcloud compute network-endpoint-groups create NEG_NAME \
      --region=REGION \
      --network-endpoint-type=SERVERLESS \
      --cloud-run-service=SERVICE_NAME

    Substitua o seguinte:

    • NEG_NAME com o nome do recurso do grupo de pontos finais de rede. (por exemplo, `myservice-neg-uscentral1`)
    • REGION com a região na qual o seu serviço está implementado.
    • SERVICE_NAME com o nome do seu serviço.
  2. Adicione o grupo de pontos finais de rede ao serviço de back-end:

    gcloud compute backend-services add-backend --global BACKEND_NAME \
      --network-endpoint-group-region=REGION \
      --network-endpoint-group=NEG_NAME

    Especifique o NEG_NAME que criou no passo anterior para a região.

  3. Repita os passos anteriores para cada região.

Terraform

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

  1. Configure um grupo de pontos finais de rede com o nome myservice-neg para o serviço do Cloud Run para cada região especificada na variável run_regions:

    resource "google_compute_region_network_endpoint_group" "lb_default" {
      provider              = google-beta
      count                 = length(local.run_regions)
      name                  = "myservice-neg"
      network_endpoint_type = "SERVERLESS"
      region                = local.run_regions[count.index]
      cloud_run {
        service = google_cloud_run_v2_service.run_default[count.index].name
      }
    }
  2. Configure um serviço de back-end para anexar o grupo de pontos finais da rede (myservice-neg):

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

Configure os registos DNS no seu domínio

Para direcionar o seu nome de domínio para a regra de encaminhamento que criou, atualize os respetivos registos de DNS com o endereço IP que criou.

  1. Encontre o endereço IP reservado do balanceador de carga executando o seguinte comando:

    gcloud compute addresses describe SERVICE_IP \
      --global \
      --format='value(address)'

    Substitua SERVICE_IP pelo nome do endereço IP que criou anteriormente. Este comando imprime o endereço IP no resultado.

  2. Atualize os registos de DNS do seu domínio adicionando um registo A com este endereço IP.

Configure o público-alvo personalizado se usar serviços autenticados

Os serviços autenticados estão protegidos pela IAM. Estes serviços do Cloud Run requerem autenticação do cliente que declara o destinatário pretendido de um pedido no momento da geração de credenciais (o público-alvo).

O público-alvo é normalmente o URL completo do serviço de destino, que, por predefinição, para os serviços do Cloud Run, é um URL gerado que termina em run.app. No entanto, numa implementação em várias regiões, um cliente não pode saber antecipadamente para que serviço regional um pedido vai ser encaminhado. Assim, para uma implementação em várias regiões, configure o seu serviço para usar públicos-alvo personalizados.

Aguarde o aprovisionamento do balanceador de carga

Depois de configurar o domínio com o endereço IP do equilibrador de carga, aguarde que os registos de DNS sejam propagados. Da mesma forma, aguarde que o certificado TLS gerido seja emitido para o seu domínio e esteja pronto para começar a publicar tráfego HTTPS a nível global.

O balanceador de carga pode demorar até 30 minutos a começar a publicar tráfego.

Quando estiver pronto, visite o URL do seu Website com o prefixo https:// para o experimentar.

Validar estado

  1. Para verificar o estado da propagação do seu registo DNS, use a dig utilidade de linha de comandos:

    dig A +short example.com

    O resultado mostra o endereço IP que configurou nos seus registos DNS.

  2. Verifique o estado da emissão do certificado gerido executando o seguinte comando:

    gcloud compute ssl-certificates describe CERT_NAME

    Substitua CERT_NAME pelo nome que escolheu anteriormente para o recurso de certificado SSL.

    O resultado mostra uma linha que contém status: ACTIVE.

Configure o redirecionamento de HTTP para HTTPS

Por predefinição, uma regra de encaminhamento processa apenas um protocolo e, por isso, os pedidos aos seus pontos finais http:// respondem com "404 Not Found". Se precisar que os pedidos aos seus http://URLs sejam redirecionados para o https:// protocolo, crie um mapa de URLs adicional e uma regra de encaminhamento com as seguintes instruções:

CLI gcloud

  1. Crie um mapa de URLs com uma regra de redirecionamento.

    gcloud compute url-maps import HTTP_URLMAP_NAME \
      --global \
      --source /dev/stdin <<EOF
            name: HTTP_URLMAP_NAME
            defaultUrlRedirect:
              redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
              httpsRedirect: True
            EOF

    Substitua HTTP_URLMAP_NAME pelo nome do recurso do mapa de URLs que vai criar (por exemplo, myservice-httpredirect).

  2. Crie um proxy HTTP de destino com o mapa de URLs.

    gcloud compute target-http-proxies create HTTP_PROXY_NAME \
      --url-map=HTTP_URLMAP_NAME

    Substitua HTTP_PROXY_NAME pelo nome do proxy HTTP de destino que vai criar (por exemplo, myservice-http).

  3. Crie uma regra de encaminhamento na porta 80 com o mesmo endereço IP reservado.

    gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \
      --target-http-proxy=HTTP_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=80
            

    Substitua HTTP_FORWARDING_RULE_NAME pelo nome da nova regra de encaminhamento que vai criar (por exemplo, myservice-httplb).

Terraform

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

  1. Crie um recurso de mapa de URLs com uma regra de redirecionamento:

    resource "google_compute_url_map" "https_default" {
      provider = google-beta
      name     = "myservice-https-urlmap"
    
      default_url_redirect {
        redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
        https_redirect         = true
        strip_query            = false
      }
    }
  2. Crie um proxy HTTP de destino com o recurso de mapa de URLs recém-criado (myservice-https-urlmap):

    resource "google_compute_target_http_proxy" "https_default" {
      provider = google-beta
      name     = "myservice-http-proxy"
      url_map  = google_compute_url_map.https_default.id
    
      depends_on = [
        google_compute_url_map.https_default
      ]
    }
  3. Crie uma regra de encaminhamento na porta 80 com o mesmo recurso de endereço IP reservado (myservice-http-proxy):

    resource "google_compute_global_forwarding_rule" "https_default" {
      provider   = google-beta
      name       = "myservice-https-fr"
      target     = google_compute_target_http_proxy.https_default.id
      ip_address = google_compute_global_address.lb_default.id
      port_range = "80"
      depends_on = [google_compute_target_http_proxy.https_default]
    }

Use subscrições push do Pub/Sub autenticadas com implementação em várias regiões

Por predefinição, um serviço Pub/Sub envia mensagens para pontos finais push na mesma Google Cloud região onde o serviço Pub/Sub armazena as mensagens. Para uma solução alternativa a este comportamento, consulte o artigo Usar uma subscrição push do Pub/Sub autenticada com uma implementação do Cloud Run em várias regiões.

Configure uma comutação por falha manual

Para configurar manualmente o tráfego para fazer failover para uma região em bom estado, modifique o mapa de URLs do balanceador de carga de aplicações externo global.

  1. Para atualizar o mapa de URLs do Application Load Balancer externo global, remova o NEG do serviço de back-end com a flag --global:

    gcloud compute backend-services remove-backend BACKEND_NAME \
    --network-endpoint-group=NEG_NAME \
    --network-endpoint-group-region=REGION \
    --global
    

    Substitua o seguinte:

    • BACKEND_NAME: o nome do serviço de back-end.
    • NEG_NAME: o nome do recurso do grupo de pontos finais da rede, por exemplo, myservice-neg-uscentral1.
    • REGION: a região onde o NEG foi criado e da qual quer remover o seu serviço. Por exemplo, europe-west1,asia-east1.
  2. Para confirmar que uma região em bom estado está agora a publicar tráfego, navegue para https://<domain-name>.