Acesso particular do Cloud Run ao endpoint global e regional do Cloud Storage

1. Introdução

Endpoint de API do Google

As APIs do Cloud oferecem diferentes tipos de endpoints para acessar serviços, principalmente em relação ao tratamento do roteamento de solicitações, da residência de dados e do isolamento regional.

Consulte a documentação do produto sobre os tipos de endpoint de API.

Confira um resumo dos endpoints globais, regionais e de local:

  1. Endpoints globais
  • Formato: {service}.googleapis.com (por exemplo, storage.googleapis.com)
  • Descrição:esses endpoints fornecem um único ponto de acesso global a um serviço. Eles não especificam uma região no URL.
  • Roteamento:as solicitações são roteadas por front-ends globais do Google (GFE) e balanceamento de carga de serviço global, geralmente direcionando o tráfego para a região íntegra mais próxima para minimizar a latência.
  • Encerramento de TLS:ocorre no GFE mais próximo do cliente, que pode estar fora da região do Google Cloud onde os dados ou recursos residem.
  • Residência de dados: nenhuma garantia é fornecida para dados em trânsito. Os dados podem cruzar fronteiras regionais após a descriptografia na GFE.
  • Isolamento regional:limitado. Embora os back-ends sejam regionais, o ponto de entrada e o balanceamento de carga são globais. Isso significa que problemas em uma parte da infraestrutura global podem afetar os serviços em outras regiões.
  • Caso de uso:acesso de uso geral em que a baixa latência para usuários dispersos geograficamente é fundamental, e a residência estrita de dados em trânsito não é uma preocupação principal.
  1. Endpoints regionais (REP)
  • Formato: {service}.{location}.rep.googleapis.com (por exemplo, storage.us-east1.rep.googleapis.com)
  • Descrição:projetadas para oferecer isolamento regional forte e garantias de residência de dados. O local (uma região específica do Google Cloud) é especificado como um subdomínio. Esse é o padrão moderno e está substituindo os endpoints de local.
  • Roteamento:usa uma pilha de front-end totalmente regionalizada, incluindo balanceadores de carga externos regionais e balanceamento de carga de serviço regional . Todo o caminho da solicitação, do DNS ao back-end do serviço, permanece na região especificada.
  • Encerramento de TLS:ocorre na região especificada nos balanceadores de carga externos regionais.
  • Residência de dados:garante que os dados permaneçam na região designada, tanto em trânsito quanto em uso, atendendo a requisitos estritos de compliance e soberania.
  • Isolamento regional:forte. Falhas na infraestrutura de front-end de uma região não afetam outras regiões.
  • Caso de uso:aplicativos que exigem residência de dados estrita, alto isolamento regional e compliance.

Nem todas as APIs do Google têm um endpoint regional. Consulte aqui todos os endpoints regionais compatíveis.

Os endpoints regionais multirregionais (mREP) também são endpoints regionais, como us (Estados Unidos), eu (União Europeia) etc. (por exemplo, storage.us.rep.googleapis.com).

  1. Endpoints de localização (LEP)
  • Formato: {location}-{service}.googleapis.com (por exemplo, us-east1-storage.googleapis.com)
  • Descrição:esses endpoints eram uma abordagem anterior para fornecer acesso específico ao local. O local faz parte do nome do host principal. Observação:os endpoints de local estão sendo substituídos pelos endpoints regionais.
  • Roteamento:ainda depende dos front-ends globais do Google.
  • Encerramento de TLS:geralmente ocorre no GFE, que pode não estar na região especificada no nome do host.
  • Residência de dados: não é possível garantir que os dados permaneçam na região especificada durante o trânsito do tráfego da Internet pública.
  • Isolamento regional:mais fraco do que os endpoints regionais porque usam infraestrutura de front-end global.
  • Caso de uso:usado historicamente em alguns cenários de acesso regional, mas agora geralmente desencorajado em favor dos endpoints regionais para garantias mais fortes.

Private Service Connect para APIs do Google

O Private Service Connect é um recurso da rede do Google Cloud que permite que os consumidores acessem serviços de produtores. Isso inclui a capacidade de se conectar às APIs do Google por um endpoint particular hospedado na VPC do usuário.

Como usar o endpoint do PSC para acessar a API do Google:

Como usar o back-end do PSC para acessar a API do Google:

O Cloud Run envia tráfego para a rede VPC

A saída de VPC direta traz uma infraestrutura aprimorada e configuração de saída de VPC mais simples para o Cloud Run, incluindo as seguintes vantagens:

  • Configuração: os serviços e jobs do Cloud Run podem enviar tráfego para uma rede VPC sem o overhead por gerenciar um conector de acesso VPC sem servidor.
  • Custo: você paga apenas pelas cobranças do tráfego de rede, que tem redução da escala a zero assim como o próprio serviço.
  • Segurança: use tags de rede diretamente nas revisões de serviço para uma segurança de rede mais granular.
  • Desempenho: menor latência, maior capacidade de processamento.

É possível ativar seu serviço, função, job ou pool de trabalhadores do Cloud Run para enviar todo o tráfego a uma rede VPC usando a saída de VPC direta.

2. O que você vai aprender

  • Como criar um endpoint do PSC para a API global do Google.
  • Como criar um endpoint do PSC para a API regional do Google.
  • Como mudar o endpoint de API no código do Cloud Run e configurar a rede para saída.

3. Arquitetura geral do laboratório

8f5328678688f210.png

4. Etapas de preparação

Papéis do IAM necessários para trabalhar no laboratório

Comece atribuindo os papéis necessários do IAM à conta do GCP no nível do projeto.

  • Administrador de rede do Compute (roles/compute.networkAdmin): esse papel oferece controle total dos recursos de rede do Compute Engine.
  • Administrador do Logging (roles/logging.admin): esse papel dá acesso a todas as permissões de geração de registros e permissões dependentes.
  • Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin): esse papel permite ativar, desativar e inspecionar estados de serviço, inspecionar operações, consumir cota e gerar faturamento para o projeto de um consumidor.
  • Administrador do DNS (roles/dns.admin): essa função concede acesso de leitura e gravação a todos os recursos do Cloud DNS.
  • Administrador do Cloud Run (roles/run.admin): esse papel oferece controle total sobre todos os recursos do Cloud Run.
  • Administrador do Storage (roles/storage.admin): concede controle total de objetos e buckets.

Ativar APIs

No Cloud Shell, verifique se o projeto está configurado corretamente e defina as variáveis de ambiente.

No Cloud Shell, faça o seguinte:

gcloud auth login
gcloud config set project <your project id>
export project_id=<your project id>
export region=<your region>
export zone=$region-a
echo $project_id
echo $region

Ative todas as APIs do Google necessárias no projeto. No Cloud Shell, faça o seguinte:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  servicedirectory.googleapis.com \
  networkconnectivity.googleapis.com

Criar VPC

No projeto, crie uma rede VPC com modo de sub-rede personalizado. Faça o seguinte no Cloud Shell:

gcloud compute networks create mynet \
    --subnet-mode=custom

Criar sub-redes

No Cloud Shell, faça o seguinte para criar uma sub-rede IPv4:

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/24 \
    --region=$region

Criar o Cloud NAT e o Cloud Router

O Cloud NAT é usado para permitir que jobs do Cloud Run se conectem a sites externos.

gcloud compute routers create $region-cr \
   --network=mynet \
   --region=$region 
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

5. Criar endpoint do PSC para o Cloud Storage

Você vai criar dois endpoints particulares do PSC para o Cloud Storage, um com escopo global e outro com escopo regional.

Criar endpoint do PSC de escopo global

Com o Private Service Connect, é possível criar endpoints particulares com escopo global usando endereços IP internos globais na rede VPC.

Você precisa alocar um endereço IP exclusivo que não esteja definido na sua VPC. Consulte o documento sobre esse requisito de endereço IP.

No Cloud Shell, faça o seguinte para criar um endereço IP. Mude –addresses=<pscendpointip> para usar o endereço IP alocado.

gcloud compute addresses create pscglobalip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=<pscendpointip> \
    --network=mynet
pscendpointip=$(gcloud compute addresses list --filter=name:pscglobalip --format="value(address)")
echo $pscendpointip

Crie uma regra de encaminhamento para conectar o endpoint aos serviços e APIs do Google.

gcloud compute forwarding-rules create pscendpoint \
    --global \
    --network=mynet \
    --address=pscglobalip \
    --target-google-apis-bundle=all-apis

Verificar p.googleapis.com no Cloud DNS

Quando você cria um endpoint, as seguintes configurações de DNS são criadas automaticamente:

  • Uma zona de DNS particular do Diretório de serviços é criada para p.googleapis.com.
  • Os registros DNS são criados em p.googleapis.com para alguns serviços e APIs do Google usados com frequência que estão disponíveis pelo Private Service Connect e têm nomes DNS padrão que terminam em googleapis.com.

Os endpoints globais são registrados no Diretório de serviços. Você vai usar storage-[nome do endpoint psc].p.googleapis.com para acessar o Cloud Storage. Consulte a documentação do produto para saber detalhes.

Para verificar se a zona p.googleaps.com já foi criada, execute o comando.

gcloud dns managed-zones list

Se você quiser usar o nome DNS padrão, storage.googleapis.com, crie uma zona particular storage.googleapis.com no Cloud DNS e adicione um registro de vértice que aponta para o endpoint do PSC do endereço IP de escopo global.

Criar endpoint do PSC de escopo regional para o Cloud Storage

Você vai precisar de um IP da sub-rede da VPC. Execute o comando abaixo. Um IP da sub-rede será alocado para o endpoint do PSC.

gcloud network-connectivity regional-endpoints create psc-regional-endpoint \
    --region=$region \
    --network=projects/$project_id/global/networks/mynet \
    --subnetwork=projects/$project_id/regions/$region/subnetworks/mysubnet \
    --target-google-api=storage.us-central1.rep.googleapis.com

Receba o endereço IP do endpoint criado na etapa acima.

regionalip=$(gcloud network-connectivity regional-endpoints describe psc-regional-endpoint --region=$region --format="value(address)")
echo $regionalip

Você vai usar storage.us-central1.rep.googleapis.com para acessar o Cloud Storage. É necessário criar uma zona particular para storage.us-central1.rep.googleapis.com e o registro de vértice do endereço IP que você acabou de criar para o endpoint regional no Cloud DNS.

Criar uma zona particular para o endpoint regional do Cloud Storage

Você vai usar storage.[nome da região].rep.googleapis.com para acessar o endpoint regional do Cloud Storage.

Você precisará criar uma zona particular no Cloud DNS e adicionar um registro de vértice que aponte para o endereço IP do endpoint regional do Cloud Storage.

No comando abaixo, "us-central1" é a região de exemplo. Crie a zona com o nome da sua região.

gcloud dns managed-zones create psc-regional-endpoint-zone \
  --description="" \
  --dns-name="storage.us-central1.rep.googleapis.com" \
  --visibility="private" \
  --networks="mynet"

gcloud dns record-sets create storage.us-central1.rep.googleapis.com. \
  --rrdatas=$regionalip \
  --ttl=300 \
  --type=A \
  --zone=psc-regional-endpoint-zone

6. Configurar um job do Cloud Run com endpoint PSC de escopo global

Acessar o código

Primeiro, você vai explorar um aplicativo Node.js para fazer capturas de tela de páginas da Web e armazená-las no Cloud Storage. Mais tarde, você vai criar uma imagem de contêiner para o aplicativo e executá-la como um job no Cloud Run.

No Cloud Shell, execute o seguinte comando para clonar o código do aplicativo deste repositório:

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

Acesse o diretório que contém o aplicativo:

cd jobs-demos/screenshot

Você verá este layout de arquivo:

|

├── Dockerfile

├── README.md

├── screenshot.js

├── package.json

Veja uma breve descrição de cada página:

  • O arquivo screenshot.js contém o código Node.js do aplicativo. O aplicativo faz capturas de tela de páginas da Web e as armazena no Cloud Storage.
  • O package.json define as dependências da biblioteca.
  • O Dockerfile define a imagem do contêiner.

Abra o código screenshot.js e mude o apiEndpoint para o endpoint global do PSC. Pesquise o código e substitua const storage = new Storage(); pelo seguinte:

const storage = new Storage(
    {
      apiEndpoint:'https://storage-pscendpoint.p.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

Implantar um job

Antes de criar um job, você precisa criar uma conta de serviço para executar esse job.

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"

Atribua o papel storage.admin à conta de serviço para que ela possa ser usada para criar buckets e objetos.

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.admin \
  --member serviceAccount:screenshot-sa@$project_id.iam.gserviceaccount.com

Conceda os papéis "Usuário de objetos do Storage", "Gravador de registros" e "Administrador do repositório do Artifact Registry" à conta de serviço de computação padrão.

project_number=$(gcloud projects describe $project_id --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.objectUser \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/logging.logWriter \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/artifactregistry.repoAdmin \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

Você vai ativar a saída de VPC direta para que os jobs do Cloud Run enviem todo o tráfego a uma rede VPC.

No Cloud Shell, faça o seguinte:

gcloud run jobs deploy screenshot-1 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$project_id-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

Execute o job

No Cloud Shell, faça o seguinte:

gcloud run jobs execute screenshot-1 --region=$region

Verifique o status do job e os registros. Acesse o console do Cloud Run e procure o job. Clique no job e confira o histórico do registro. Você vai ver um resultado de execução de job semelhante ao abaixo.

bae25d504ea20384.png

Para registros detalhados de execução do job, clique em "Ver registro" na tarefa. Você vai ver registros de jobs semelhantes aos abaixo.

aa0468dc463f4320.png

Um novo bucket foi criado. Acesse o console do Cloud Storage e verifique o novo bucket criado. Ao usar o endpoint global do Cloud Storage, o bucket é multirregional. Você pode verificar as imagens enviadas ao bucket.

O resultado do teste mostra que o Cloud Run acessou de forma privada o endpoint global do Cloud Storage, que você mudou no job do Cloud Run:

apiEndpoint:‘https://storage-pscendpoint.p.googleapis.com.'

7. Configurar um job do Cloud Run com um endpoint de PSC de escopo regional

No código, você vai mudar o apiEndpoint para o endpoint do PSC com escopo regional.

Procure o código e substitua const storage = new Storage(); pelo seguinte ( usamos us-central1 como exemplo. Mude para sua região:

const storage = new Storage(
    {
      apiEndpoint:'https://storage.us-central1.rep.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

Implantar um job

Verifique se você está no diretório que contém o aplicativo (jobs-demos/screenshot).

pwd

Você ativa a saída direta de VPC para que os jobs enviem todo o tráfego a uma rede VPC.

No Cloud Shell, faça o seguinte:

gcloud run jobs deploy screenshot-2 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

Execute o job

No Cloud Shell, faça o seguinte:

gcloud run jobs execute screenshot-2 --region=$region

Verifique o status do job e os registros. Acesse o console do Cloud Run e procure o job. Clique no job e confira o histórico dele. Você vai ver um resultado de execução de job semelhante ao abaixo.

1065ce25136d355e.png

Para registros detalhados de execução de jobs, clique em "Ver registro". Você vai ver registros de jobs semelhantes aos abaixo.

837afb2f95a7049b.png

Um novo bucket foi criado. Acesse o console do Cloud Storage e verifique o novo bucket criado. Ao usar o endpoint regional do Cloud Storage, o bucket é de uma única região. Você pode verificar as imagens enviadas ao bucket.

O resultado do teste mostra que o Cloud Run acessou de forma privada o endpoint regional do Cloud Storage, que você mudou no job do Cloud Run:

apiEndpoint:‘https://storage.us-central1.rep.googleapis.com.'

8. Limpar

Limpar job do Cloud Run

gcloud run jobs delete screenshot-1 \
  --region=$region --quiet
gcloud run jobs delete screenshot-2 \
  --region=$region --quiet

gcloud iam service-accounts delete screenshot-sa@$project_id.iam.gserviceaccount.com --quiet

Limpar endpoint do PSC

gcloud compute forwarding-rules delete pscendpoint \
    --global --quiet
gcloud network-connectivity regional-endpoints delete psc-regional-endpoint \
    --region=$region --quiet
gcloud compute addresses delete pscglobalip \
    --global --quiet

Limpar o Cloud NAT, o Cloud Router e as VPCs

gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete mysubnet \
    --region=$region --quiet
gcloud compute networks delete mynet --quiet

9. Parabéns

Você testou com êxito o acesso privado do Cloud Run ao Cloud Storage usando o endpoint global e o endpoint regional.