Como usar o Private Service Connect para APIs do Google para acessar o Gemini por uma conexão híbrida

1. Introdução

O Private Service Connect para APIs do Google (PSC) é um recurso de rede do Google Cloud que permite aos usuários configurar o acesso particular por um endpoint global de IP particular em uma VPC. Para usuários que executam código ou aplicativos do lado do cliente em um ambiente híbrido conectado ao Google Cloud por uma VPN ou interconexão, o PSC é usado para resolver as APIs do Google nessa conexão híbrida particular.

O PSC para APIs do Google pode resolver muitos domínios diferentes. A lista completa pode ser encontrada aqui. O domínio mais usado pelas APIs do Google é <API>.googleapis.com. Além desse domínio, o PSC também oferece aos usuários uma versão do googleapis.com que é <API>-<PSC-ENDPOINT-NAME>.**p.**googleapis.com. Com esse domínio, os usuários podem configurar aplicativos para usar endpoints específicos do PSC. O caso de uso mais comum permite que os usuários escolham quais aplicativos usam o endpoint do PSC para rotear o tráfego da API do Google pela conexão híbrida, enquanto outros aplicativos continuam roteando o tráfego para o endpoint da API pública.

O Gemini faz parte do pacote de produtos da Vertex AI do Google Cloud e está incluído na lista de APIs do Google que podem ser resolvidas com o PSC para APIs do Google.

Neste codelab, você vai criar um ambiente híbrido simulado, hospedando uma instância do Workbench no local e executando um código Python do Gemini que acessa a API Gemini de forma particular por uma VPN de alta disponibilidade, conectando-se a um PSC para um endpoint de APIs do Google.

O que você vai aprender

  • Crie um hub do NCC.
  • Configurar spokes da VPC em um hub do NCC.
  • Crie uma VPN de alta disponibilidade do Cloud.
  • Configure spokes híbridos em um hub do NCC.
  • Crie um endpoint do PSC para APIs do Google.
  • Configure uma rota personalizada pela VPN de alta disponibilidade.
  • Configure uma zona de peering de DNS.
  • Configurar uma instância do Vertex Workbench
  • Configure o código Python do Gemini para usar um PSC em um endpoint da API Google APIs.

O que é necessário

  • Um projeto do Google Cloud com permissões de "Proprietário" ou "Editor" completas.

2. Topologia do codelab

74f1027c8c8085f6.png

Neste codelab, você vai usar o Google Cloud para simular um ambiente híbrido. Algumas etapas deste codelab são específicas do Google Cloud e seriam diferentes se configuradas em um ambiente local real. Essas etapas serão indicadas.

Você vai criar um hub do NCC que tem uma VPC de roteamento como um spoke de VPC. Nessa VPC, uma VPN de alta disponibilidade será configurada para a VPC local, que simula um ambiente local. A VPN de alta disponibilidade será configurada como um spoke híbrido no hub do NCC. Na VPC local, você vai criar uma sub-rede em que uma instância do Workbench será hospedada. Você também vai criar um Cloud NAT para baixar pacotes na instância do Workbench.

Por fim, você vai criar uma zona de peering de DNS para a VPC local usar a zona particular do Service Directory para p.googleapis.com, que o PSC para APIs do Google cria automaticamente.

3. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:

55efc1aaa7a4d3ad.png

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

7ffe5cbb04455448.png

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.

4. Antes de começarDuração: 2:00

Ativar APIs

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

No Cloud Shell

gcloud config list project
gcloud config set project <project-id>
export project=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project
echo $region
echo $zone

Ative todas as APIs do Google necessárias no projeto.

No Cloud Shell

gcloud services enable compute.googleapis.com
gcloud services enable networkconnectivity.googleapis.com
gcloud services enable dns.googleapis.com
gcloud services enable notebooks.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable aiplatform.googleapis.com

5. Criar VPCs e sub-redesDuração: 5:00

Criar redes

No Cloud Shell

gcloud compute networks create routing-vpc \
    --subnet-mode=custom

No Cloud Shell

gcloud compute networks create onprem-vpc \
    --subnet-mode=custom

gcloud compute networks subnets create onprem-$region-subnet \
    --network=onprem-vpc \
    --range=10.0.0.0/24 \
    --region=$region
    --enable-private-ip-google-access

Criar Cloud Routers e Cloud NAT

Crie um Cloud Router que será usado com a VPN de alta disponibilidade na VPC de roteamento.

No Cloud Shell

gcloud compute routers create routing-$region-cr \
    --network=routing-vpc \
    --region=$region \
    --asn=64512

Crie um Cloud Router que será usado com a VPN de alta disponibilidade em "onprem-vpc".

No Cloud Shell

gcloud compute routers create onprem-$region-cr \
    --network=onprem-vpc \
    --region=$region \
    --asn=64513

Crie um Cloud Router que será usado com o Cloud NAT na onprem-vpc.

No Cloud Shell

gcloud compute routers create onprem-$region-cr-4nat \
    --network=onprem-vpc \
    --region=$region

O Cloud NAT na onprem-vpc será usado para fazer o download de pacotes na instância do Vertex AI Workbench, que será configurada em uma etapa posterior.

No Cloud Shell

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

6. Criar uma VPN de alta disponibilidade do CloudDuração: 7:00

Crie os gateways de VPN.

No Cloud Shell

gcloud compute vpn-gateways create routing-gateway \
   --network=routing-vpc \
   --region=$region \
   --stack-type=IPV4_ONLY

No Cloud Shell

gcloud compute vpn-gateways create onprem-gateway \
   --network=onprem-vpc \
   --region=$region \
   --stack-type=IPV4_ONLY

Crie os túneis VPN originados da routing-vpc.

No Cloud Shell

gcloud compute vpn-tunnels create routing-to-onprem-tunnel0 \
    --peer-gcp-gateway=onprem-gateway \
    --region=$region \
    --ike-version=2 \
    --shared-secret=mysecret \
    --router=routing-$region-cr \
    --vpn-gateway=routing-gateway \
    --interface=0

gcloud compute vpn-tunnels create routing-to-onprem-tunnel1 \
    --peer-gcp-gateway=onprem-gateway \
    --region=$region \
    --ike-version=2 \
    --shared-secret=mysecret \
    --router=routing-$region-cr \
    --vpn-gateway=routing-gateway \
    --interface=1

Crie os túneis VPN originados da onprem-vpc.

No Cloud Shell

gcloud compute vpn-tunnels create onprem-to-routing-tunnel0 \
    --peer-gcp-gateway=routing-gateway \
    --region=$region \
    --ike-version=2 \
    --shared-secret=mysecret \
    --router=onprem-$region-cr \
    --vpn-gateway=onprem-gateway \
    --interface=0

    gcloud compute vpn-tunnels create onprem-to-routing-tunnel1 \
    --peer-gcp-gateway=routing-gateway \
    --region=$region \
    --ike-version=2 \
    --shared-secret=mysecret \
    --router=onprem-$region-cr \
    --vpn-gateway=onprem-gateway \
    --interface=1

Configure sessões do BGP para os dois túneis originados da routing-vpc.

No Cloud Shell

gcloud compute routers add-interface routing-$region-cr \
    --interface-name=routing-interface0 \
    --ip-address=169.254.0.1 \
    --mask-length=30 \
    --vpn-tunnel=routing-to-onprem-tunnel0 \
    --region=$region

gcloud compute routers add-bgp-peer routing-$region-cr \
    --peer-name=routingtoonprem-bgp0 \
    --interface=routing-interface0 \
    --peer-ip-address=169.254.0.2 \
    --peer-asn=64513 \
    --region=$region

gcloud compute routers add-interface routing-$region-cr \
  --interface-name=routing-interface1 \
  --ip-address=169.254.1.1 \
  --mask-length=30 \
  --vpn-tunnel=routing-to-onprem-tunnel1 \
  --region=$region

gcloud compute routers add-bgp-peer routing-$region-cr \
    --peer-name=routingtoonprem-bgp1 \
    --interface=routing-interface1 \
    --peer-ip-address=169.254.1.2 \
    --peer-asn=64513 \
    --region=$region

Configure sessões do BGP para os dois túneis originados da onprem-vpc.

No Cloud Shell

gcloud compute routers add-interface onprem-$region-cr \
    --interface-name=onprem-interface0 \
    --ip-address=169.254.0.2 \
    --mask-length=30 \
    --vpn-tunnel=onprem-to-routing-tunnel0 \
    --region=$region

gcloud compute routers add-bgp-peer onprem-$region-cr \
    --peer-name=onpremtorouting-bgp0 \
    --interface=onprem-interface0 \
    --peer-ip-address=169.254.0.1 \
    --peer-asn=64512 \
    --region=$region

gcloud compute routers add-interface onprem-$region-cr \
  --interface-name=onprem-interface1 \
  --ip-address=169.254.1.2 \
  --mask-length=30 \
  --vpn-tunnel=onprem-to-routing-tunnel1 \
  --region=$region

gcloud compute routers add-bgp-peer onprem-$region-cr \
    --peer-name=onpremtorouting-bgp1 \
    --interface=onprem-interface1 \
    --peer-ip-address=169.254.1.1 \
    --peer-asn=64512 \
    --region=$region

Acesse a página "Conectividade de rede" > "VPN" no console e verifique se os túneis de VPN de alta disponibilidade e as sessões do BGP estão configurados corretamente.

7. Configurar hub e spokes do NCCDuração:10:00

Criar hub do NCC

No Cloud Shell

gcloud network-connectivity hubs create ncc-hub \
    --project="$project" \
    --preset-topology="mesh"

Criar spokes do NCC

O NCC gcloud exige que todos os spokes sejam configurados com nomes de caminhos completos ou URIs.

No Cloud Shell

gcloud compute networks describe routing-vpc

Anote o caminho completo (URI) da VPC de roteamento para o seguinte comando.

Exemplo de saída

autoCreateSubnetworks: false
creationTimestamp: '2025-08-20T11:13:42.233-07:00'
id: 'xxx'
kind: compute#network
name: routing-vpc
networkFirewallPolicyEnforcementOrder: AFTER_CLASSIC_FIREWALL
routingConfig:
  bgpBestPathSelectionMode: LEGACY
  routingMode: REGIONAL
selfLink: https://www.googleapis.com/compute/v1/projects/$project/global/networks/routing-vpc
selfLinkWithId: https://www.googleapis.com/compute/v1/projects/$project/global/networks/355666541188722361
x_gcloud_bgp_routing_mode: REGIONAL
x_gcloud_subnet_mode: CUSTOM

Configurar o spoke da VPC de roteamento

No Cloud Shell

gcloud network-connectivity spokes linked-vpc-network create routing-vpc \
    --hub=ncc-hub \
    --vpc-network=projects/$project/global/networks/routing-vpc \
    --global

No Cloud Shell

gcloud compute vpn-tunnels describe routing-to-onprem-tunnel0 --region=$region
gcloud compute vpn-tunnels describe routing-to-onprem-tunnel1 --region=$region

Anote os caminhos completos (URIs) dos túneis VPN originados da routing-vpc.

Exemplo de saída

creationTimestamp: '2025-08-20T11:33:37.494-07:00'
description: ''
detailedStatus: Tunnel is up and running.
id: 'xxx'
ikeVersion: 2
kind: compute#vpnTunnel
labelFingerprint: xxx
localTrafficSelector:
- 0.0.0.0/0
name: routing-to-onprem-tunnel0
peerGcpGateway: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/vpnGateways/onprem-gateway
peerIp: 34.153.54.166
region: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1
remoteTrafficSelector:
- 0.0.0.0/0
router: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/routers/routing-us-central1-cr
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/vpnTunnels/routing-to-onprem-tunnel0
sharedSecret: '*************'
sharedSecretHash: xxx
status: ESTABLISHED
vpnGateway: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/vpnGateways/routing-gateway

vpnGatewayInterface: 0
creationTimestamp: '2025-08-20T11:33:41.829-07:00'
description: ''
detailedStatus: Tunnel is up and running.
id: 'xxx'
ikeVersion: 2
kind: compute#vpnTunnel
labelFingerprint: xxx
localTrafficSelector:
- 0.0.0.0/0
name: routing-to-onprem-tunnel1
peerGcpGateway: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/vpnGateways/onprem-gateway
peerIp: 34.153.246.117
region: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1
remoteTrafficSelector:
- 0.0.0.0/0
router: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/routers/routing-us-central1-cr
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/vpnTunnels/routing-to-onprem-tunnel1
sharedSecret: '*************'
sharedSecretHash: xxx
status: ESTABLISHED
vpnGateway: https://www.googleapis.com/compute/v1/projects/$project/regions/us-central1/vpnGateways/routing-gateway
vpnGatewayInterface: 1

No Cloud Shell

gcloud network-connectivity spokes linked-vpn-tunnels create $region-vpn-spoke \
    --hub=ncc-hub \
  --vpn-tunnels=projects/$project/regions/$region/vpnTunnels/routing-to-onprem-tunnel0,projects/$project/regions/$region/vpnTunnels/routing-to-onprem-tunnel1 \
    --region=$region 

Verifique se todos os spokes estão configurados corretamente antes de continuar.

No Cloud Shell

gcloud network-connectivity hubs list-spokes ncc-hub

Exemplo de saída

NAME: routing-vpc
GROUP: default
PROJECT: $project
LOCATION: global
TYPE: VPC_NETWORK
STATE: ACTIVE
STATE REASON: 
ETAG: 2

NAME: us-central1-vpn-spoke
GROUP: default
PROJECT: $project
LOCATION: us-central1
TYPE: VPN_TUNNEL
STATE: ACTIVE
STATE REASON: 
ETAG: 

8. Configurar o Private Service Connect para APIs do GoogleDuração: 5:00

Os endpoints do PSC para APIs do Google são criados com endereços IP globais que não estão em uma sub-rede VPC regional. O endereço IP global precisa ser reservado especificamente para o PRIVATE_SERVICE_CONNECT.

No Cloud Shell

gcloud compute addresses create psc-ip \
  --global \
  --purpose=PRIVATE_SERVICE_CONNECT \
  --addresses=10.100.100.0 \
  --network=routing-vpc

No Cloud Shell

gcloud compute forwarding-rules create psc4googep \
  --global \
  --network=routing-vpc \
  --address=psc-ip \
  --target-google-apis-bundle=all-apis \
  --service-directory-registration=projects/$project/locations/$region

No Cloud Shell

gcloud compute routers update routing-$region-cr \
   --project=$project \
   --region=$region \
   --advertisement-mode custom \
   --set-advertisement-groups=ALL_SUBNETS \
   --set-advertisement-ranges=10.100.100.0/32

No Cloud Shell

gcloud dns managed-zones create peeringzone \
    --description="dns peer onprem to routing" \
    --dns-name=p.googleapis.com \
    --networks=onprem-vpc \
    --target-network=routing-vpc \
    --target-project=$project \
    --visibility=private

9. Configurar uma instância do Vertex WorkbenchDuração: 5:00

Crie uma conta de serviço para ser usada como a identidade da instância do Workbench.

No Cloud Shell

gcloud iam service-accounts create workbench-sa \
    --display-name="workbench-sa"

Anote o nome completo da sua conta de serviço e conceda a ela a permissão aiplatform.admin para executar chamadas para a Vertex AI/Gemini.

No Cloud Shell

gcloud iam service-accounts list

Exemplo de saída

DISPLAY NAME: Compute Engine default service account
EMAIL: xxx-compute@developer.gserviceaccount.com
DISABLED: False

DISPLAY NAME: workbench-sa
EMAIL: workbench-sa@$project.iam.gserviceaccount.com
DISABLED: False

Substitua <your-project-id> pelo ID do projeto real. Não é possível usar a variável $project aqui devido às aspas necessárias.

No Cloud Shell

gcloud projects add-iam-policy-binding $project --member='serviceAccount:workbench-sa@<your-project-id>.iam.gserviceaccount.com' --role='roles/aiplatform.admin' --condition=None

No Cloud Shell

gcloud workbench instances create workbench-$region --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --location=$region-a --network=projects/$project/global/networks/onprem-vpc --subnet=projects/$project/regions/$region/subnetworks/onprem-$region-subnet --subnet-region=$region --disable-public-ip --service-account-email=workbench-sa@$project.iam.gserviceaccount.com

O provisionamento da instância do Workbench pode levar mais tempo do que a execução do comando gcloud.

10. Teste Gemini CodeDuration: 7:00

Na interface, clique em "Abrir JupyterLab".

1b7ff959f1072aaa.png

No JupyterLab, abra um novo notebook Python 3.

18c26d06183faca1.png

Execute o seguinte código no notebook. Atualize o código para incluir as informações específicas do projeto e da região.

No notebook do JupyterLab

pip install --upgrade google-genai

Reinicie o kernel do notebook.

fe7911ce8b54ff8a.png

Anote o endpoint da API. Aqui, estamos usando o endpoint da API <YOUR_REGION>-aiplatform.googleapis.com, que é o endpoint padrão da API para a Vertex AI.

No notebook do JupyterLab

PROJECT_ID="YOUR_PROJECT_ID" # Google Cloud Project ID
LOCATION_ID="YOUR_REGION" # Enter Vertex AI Gemini region such a s us-central1
API_ENDPOINT="https://<YOUR_REGION>-aiplatform.googleapis.com" # API Endpoint
MODEL_ID="gemini-2.0-flash" # Gemini Model ID

from google import genai
from google.genai.types import (
    GenerateContentConfig,
    HarmBlockThreshold,
    HarmCategory,
    Part,
    SafetySetting,
)

No notebook do JupyterLab

from google import genai

client= genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION_ID, http_options={'base_url': API_ENDPOINT})

prompt = "what weighs more, 1kg of feathers or 1kg of stones"

safety_settings = [
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HATE_SPEECH,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
]

response = client.models.generate_content(
    model=MODEL_ID,
    contents=prompt,
    config=GenerateContentConfig(
        safety_settings=safety_settings,
    ),
)

# Response will be `None` if it is blocked.
print(response.text)

Exemplo de resposta

This is a classic trick question! They both weigh the same: 1 kilogram. The difference is in the volume they occupy and the density of the materials.

Anote o nome da API que você usou ao executar o código. YOUR_REGION-aiplatform.googleapis.com é o nome padrão da API para a Vertex AI. Precisamos mudar o nome da API e executar o código novamente. Para garantir que o código esteja usando o endpoint do PSC, execute um TCPdump em um terminal na instância do Workbench.

Executar um TCPdump em um terminal

Abra um terminal no Workbench clicando em "Arquivo" > "Novo" > "Terminal".

2cc405367de1f4c2.png

Se você tiver problemas para ver a saída de texto no terminal, atualize o tema dele. Para fazer isso, acesse Configurações > Tema do terminal > Claro OU Escuro.

No terminal

sudo tcpdump host 10.100.100.0

Atualizar o código do Gemini

Volte para o notebook, atualize o endpoint da API e execute o código novamente. Mudamos o endpoint da API para <YOUR_REGION>-aiplatform**-psc4googep.p**.googleapis.com. Isso se alinha ao formato de API específico do PSC <service>-<endpointname>.p.googleapis.com.

No notebook do JupyterLab

API_ENDPOINT="https://<YOUR_REGION>-aiplatform-psc4googep.p.googleapis.com" # API Endpoint

No notebook do JupyterLab

from google import genai
from google.genai.types import (
    GenerateContentConfig,
    HarmBlockThreshold,
    HarmCategory,
    Part,
    SafetySetting,
)

No notebook do JupyterLab

from google import genai

client= genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION_ID, http_options={'base_url': API_ENDPOINT})

prompt = "what weighs more, 1kg of feathers or 1kg of stones"

safety_settings = [
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HATE_SPEECH,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
]

response = client.models.generate_content(
    model=MODEL_ID,
    contents=prompt,
    config=GenerateContentConfig(
        safety_settings=safety_settings,
    ),
)

# Response will be `None` if it is blocked.
print(response.text)

Exemplo de resposta

They weigh the same. 1 kg is 1 kg, regardless of what it's made of.

Verificar o TCPdump

Volte para o terminal e procure chamadas para o endpoint do PSC (10.100.100.0). Encerre o TCPdump (control+c)

Exemplo de saída

listening on ens4, link-type EN10MB (Ethernet), snapshot length 262144 bytes
19:12:01.473886 IP workbench-us-central1.us-central1-a.c.xxx.internal.41886 > 10.100.100.0.https: Flags [S], seq 3367930834, win 65320, options [mss 1420,sackOK,TS val 2933602967 ecr 0,nop,wscale 7], length 0
19:12:01.476561 IP 10.100.100.0.https > workbench-us-central1.us-central1-a.c.xxx.internal.41886: Flags [S.], seq 1863301110, ack 3367930835, win 65535, options [mss 1366,sackOK,TS val 3004118895 ecr 2933602967,nop,wscale 8], length 0
19:12:01.476602 IP workbench-us-central1.us-central1-a.c.xxx.internal.41886 > 10.100.100.0.https: Flags [.], ack 1, win 511, options [nop,nop,TS val 2933602969 ecr 3004118895], length 0
19:12:01.477283 IP workbench-us-central1.us-central1-a.c.xxx.internal.41886 > 10.100.100.0.https: Flags [P.], seq 1:1573, ack 1, win 511, options [nop,nop,TS val 2933602970 ecr 3004118895], length 1572
19:12:01.478836 IP 10.100.100.0.https > workbench-us-central1.us-central1-a.c.xxx.internal.41886: Flags [.], ack 1573, win 1045, options [nop,nop,TS val 3004118898 ecr 2933602970], length 0
19:12:01.480181 IP 10.100.100.0.https > workbench-us-central1.us-central1-a.c.xxx.internal.41886: Flags [P.], seq 1:6041, ack 1573, win 1045, options [nop,nop,TS val 3004118899 ecr 2933602970], length 6040
19:12:01.480183 IP 10.100.100.0.https > workbench-us-central1.us-central1-a.c.xxx.internal.41886: Flags [P.], seq 6041:8378, ack 1573, win 1045, options [nop,nop,TS val 3004118899 ecr 2933602970], length 2337
19:12:01.480215 IP workbench-us-central1.us-central1-a.c.xxx.internal.41886 > 10.100.100.0.https: Flags [.], ack 6041, win 485, options [nop,nop,TS val 2933602973 ecr 3004118899], length 0
19:12:01.480225 IP workbench-us-central1.us-central1-a.c.xxx.internal.41886 > 10.100.100.0.https: Flags [.], ack 8378, win 473, options [nop,nop,TS val 2933602973 ecr 3004118899], length 0
19:12:01.482580 IP workbench-us-central1.us-central1-a.c.xxx.internal.41886 > 10.100.100.0.https: Flags [P.], seq 1573:1653, ack 8378, win 501, options [nop,nop,TS val 2933602975 ecr 3004118899], length 80

SUCCESS!

11. Etapas de limpeza

Feche o notebook do JupyterLab e volte ao Cloud Shell. Verifique se o Cloud Shell não expirou. Se tiver, redefina as variáveis.

No Cloud Shell

gcloud config list project
gcloud config set project <project-id>
export project=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project
echo $region
echo $zone

Exclua todos os recursos.

No Cloud Shell

gcloud workbench instances delete workbench-$region --location=$zone -q

gcloud iam service-accounts delete workbench-sa@$project.iam.gserviceaccount.com -q

gcloud dns managed-zones delete peeringzone -q

gcloud compute forwarding-rules delete psc4googep --global -q

gcloud compute addresses delete psc-ip --global -q

gcloud network-connectivity spokes delete $region-vpn-spoke --region=$region -q

gcloud network-connectivity spokes delete routing-vpc --global -q

gcloud network-connectivity hubs delete ncc-hub -q

gcloud compute vpn-tunnels delete onprem-to-routing-tunnel1 --region=$region --project=$project -q

gcloud compute vpn-tunnels delete onprem-to-routing-tunnel0 --region=$region --project=$project -q

gcloud compute vpn-tunnels delete routing-to-onprem-tunnel1 --region=$region --project=$project -q

gcloud compute vpn-tunnels delete routing-to-onprem-tunnel0 --region=$region --project=$project -q

gcloud compute vpn-gateways delete onprem-gateway --region=$region --project=$project -q

gcloud compute vpn-gateways delete routing-gateway --region=$region --project=$project -q

gcloud compute routers nats delete onprem-$region-nat --router=onprem-$region-cr-4nat --region=$region -q

gcloud compute routers delete onprem-$region-cr-4nat --region=$region -q

gcloud compute routers delete onprem-$region-cr --region=$region -q

gcloud compute routers delete routing-$region-cr --region=$region -q

gcloud compute networks subnets delete onprem-$region-subnet --region=$region -q

gcloud compute networks delete onprem-vpc -q

gcloud compute networks delete routing-vpc -q

12. Parabéns!

Parabéns por concluir o codelab.

O que vimos

  • Crie um hub do NCC.
  • Configurar spokes da VPC em um hub do NCC.
  • Crie uma VPN de alta disponibilidade do Cloud.
  • Configure spokes híbridos em um hub do NCC.
  • Crie um endpoint do PSC para APIs do Google.
  • Configure uma rota personalizada pela VPN de alta disponibilidade.
  • Configure uma zona de peering de DNS.
  • Configurar uma instância do Vertex Workbench
  • Configure o código Python do Gemini para usar um PSC em um endpoint da API Google APIs.