Usa Private Service Connect para las APIs de Google para acceder a Gemini a través de una conexión híbrida

1. Introducción

Private Service Connect para las APIs de Google (PSC) es una función de redes de Google Cloud que permite a los usuarios configurar el acceso privado a través de un extremo global de IP privada dentro de una VPC. Para los usuarios que ejecutan código o aplicaciones del cliente en un entorno híbrido conectado a Google Cloud a través de una VPN o Interconnect, se usa PSC para resolver las APIs de Google a través de esa conexión híbrida privada.

PSC para las APIs de Google puede resolver muchos dominios diferentes, cuya lista completa se puede encontrar aquí. El dominio que usan la mayoría de las APIs de Google es <API>.googleapis.com. Junto con este dominio, PSC también proporciona a los usuarios una versión de googleapis.com que es <API>-<PSC-ENDPOINT-NAME>.**p.**googleapis.com. Con este dominio, los usuarios pueden configurar aplicaciones para que usen extremos de PSC específicos. El caso de uso más común permite que los usuarios elijan qué aplicaciones usan el extremo de PSC para enrutar el tráfico de la API de Google a través de la conexión híbrida, mientras que otras aplicaciones pueden seguir enrutando el tráfico al extremo de la API pública.

Gemini forma parte del paquete de productos de Vertex AI de Google Cloud y se incluye en la lista de APIs de Google que se pueden resolver con PSC para las APIs de Google.

En este codelab, compilarás un entorno híbrido simulado, alojarás una instancia de Workbench de forma local y ejecutarás código de Python de Gemini que accede a la API de Gemini de forma privada a través de una VPN con alta disponibilidad, conectándose a un extremo de PSC para las APIs de Google.

Qué aprenderás

  • Crea un concentrador de NCC.
  • Configura radios de VPC en un concentrador de NCC.
  • Crea una VPN con alta disponibilidad de Cloud.
  • Configura radios híbridos en un concentrador de NCC.
  • Crea un extremo de PSC para las APIs de Google.
  • Configura una ruta personalizada a través de la VPN con alta disponibilidad.
  • Configura una zona de intercambio de tráfico de DNS.
  • Configura una instancia de Vertex Workbench
  • Configura el código de Python de Gemini para usar un extremo de la API de PSC para las APIs de Google.

Requisitos

  • Un proyecto de Google Cloud con permisos de "Propietario" o "Editor" completos

2. Topología del codelab

74f1027c8c8085f6.png

En este codelab, usarás Google Cloud para simular un entorno híbrido. En este codelab, habrá pasos específicos de Google Cloud que serían diferentes si se configuraran desde un entorno local real. Se indicarán esos pasos.

Crearás un concentrador de NCC que tendrá una VPC de enrutamiento como radio de VPC. En esa VPC, se configurará una VPN con alta disponibilidad para la VPC local, que simula un entorno local. La VPN con alta disponibilidad se configurará como un radio híbrido en el concentrador de NCC. En la VPC local, crearás una subred en la que se alojará una instancia de Workbench. También crearás una instancia de Cloud NAT para descargar paquetes en la instancia de Workbench.

Por último, crearás una zona de peering de DNS para que la VPC local pueda usar la zona privada del Directorio de servicios para p.googleapis.com que PSC para las APIs de Google crea automáticamente.

3. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Inicia Cloud Shell

Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

En Google Cloud Console, haz clic en el ícono de Cloud Shell en la barra de herramientas en la parte superior derecha:

55efc1aaa7a4d3ad.png

El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:

7ffe5cbb04455448.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador. No es necesario que instales nada.

4. Antes de comenzarDuración: 2:00

Habilita las APIs

En Cloud Shell, asegúrate de que tu proyecto esté configurado correctamente y establece tus variables de entorno.

Desde 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

Habilita todas las APIs de Google necesarias en el proyecto.

Desde 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. Crea VPCs y subredesDuración: 5:00

Crear redes

Desde Cloud Shell

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

Desde 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

Crea Cloud Routers y Cloud NAT

Crea un Cloud Router que se usará junto con la VPN con alta disponibilidad en la VPC de enrutamiento.

Desde Cloud Shell

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

Crea un Cloud Router que se usará junto con la VPN con alta disponibilidad en onprem-vpc.

Desde Cloud Shell

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

Crea un Cloud Router que se usará junto con Cloud NAT en onprem-vpc.

Desde Cloud Shell

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

El Cloud NAT en onprem-vpc se usará para descargar paquetes en la instancia de Vertex AI Workbench que se configurará en un paso posterior.

Desde 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. Crea una VPN con alta disponibilidad de CloudDuración: 7:00

Crea las puertas de enlace de VPN.

Desde Cloud Shell

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

Desde Cloud Shell

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

Crea los túneles VPN que se originan en routing-vpc.

Desde 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

Crea los túneles VPN que se originan en onprem-vpc.

Desde 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

Configura sesiones de BGP para los dos túneles que se originan en la VPC de enrutamiento.

Desde 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

Configura sesiones de BGP para los dos túneles que se originan en onprem-vpc.

Desde 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

Navega a la página Red > VPN en la consola y asegúrate de que tus túneles de VPN con alta disponibilidad y sesiones de BGP estén configurados correctamente.

7. Configura el concentrador y los radios de NCCDuración:10:00

Crea el concentrador de NCC

Desde Cloud Shell

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

Crea radios de NCC

gcloud de NCC requiere que todos los radios se configuren con nombres de ruta de acceso completos o URIs.

Desde Cloud Shell

gcloud compute networks describe routing-vpc

Ten en cuenta la ruta de acceso completa (URI) de la VPC de enrutamiento para el siguiente comando.

Resultado de ejemplo:

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

Configura el radio de la VPC de enrutamiento

Desde Cloud Shell

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

Desde Cloud Shell

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

Ten en cuenta las rutas de acceso completas (URIs) de los túneles VPN que se originan en la VPC de enrutamiento.

Resultado de ejemplo:

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

Desde 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 

Antes de continuar, asegúrate de que todos los radios estén configurados correctamente.

Desde Cloud Shell

gcloud network-connectivity hubs list-spokes ncc-hub

Resultado de ejemplo:

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. Configura Private Service Connect para las APIs de GoogleDuración: 5:00

Los extremos de PSC para las APIs de Google se crean a partir de direcciones IP globales que no se encuentran en una subred de VPC regional. La dirección IP global debe reservarse específicamente con el propósito de PRIVATE_SERVICE_CONNECT.

Desde Cloud Shell

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

Desde 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

Desde 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

Desde 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. Configura la instancia de Vertex WorkbenchDuración: 5:00

Crea una cuenta de servicio que se usará para la identidad de la instancia de Workbench.

Desde Cloud Shell

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

Toma nota del nombre completo de tu cuenta de servicio y otórgale el permiso aiplatform.admin para ejecutar llamadas a Vertex AI/Gemini.

Desde Cloud Shell

gcloud iam service-accounts list

Resultado de ejemplo:

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

Asegúrate de reemplazar <your-project-id> por el ID de tu proyecto real. No podemos usar la variable $project aquí debido a las comillas requeridas.

Desde 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

Desde 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

El aprovisionamiento de la instancia de Workbench puede tardar más que la ejecución del comando de gcloud.

10. Prueba de Gemini CodeDuration: 7:00

En la IU, haz clic en "Abrir JupyterLab".

1b7ff959f1072aaa.png

Una vez que estés en JupyterLab, abre un notebook nuevo de Python 3.

18c26d06183faca1.png

Ejecuta el siguiente código en el notebook. Asegúrate de actualizar el código para incluir la información específica de tu proyecto y región.

Desde un notebook de JupyterLab

pip install --upgrade google-genai

Reinicia el kernel del notebook.

fe7911ce8b54ff8a.png

Ten en cuenta el extremo de la API. Aquí usamos el extremo de API <YOUR_REGION>-aiplatform.googleapis.com, que es el extremo de API estándar para Vertex AI.

Desde un notebook de 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,
)

Desde un notebook de 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)

Respuesta de muestra:

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.

Toma nota del nombre de la API que usaste cuando ejecutaste el código. YOUR_REGION-aiplatform.googleapis.com es el nombre de API predeterminado para Vertex AI. Debemos cambiar el nombre de la API y volver a ejecutar el código. Para asegurarnos de que el código use el extremo de PSC, podemos ejecutar un TCPdump en una terminal de la instancia de Workbench.

Ejecuta un TCPdump en una terminal

Para abrir una terminal en Workbench, haz clic en File > New > Terminal.

2cc405367de1f4c2.png

Si tienes problemas para ver el texto de salida en la terminal, debes actualizar el tema de la terminal. Para ello, ve a Configuración > Tema de la terminal > Claro O bien Oscuro.

Desde la terminal

sudo tcpdump host 10.100.100.0

Actualizar Gemini Code

Vuelve al notebook, actualiza el extremo de la API y vuelve a ejecutar el código. Ten en cuenta que cambiamos el extremo de la API a <YOUR_REGION>-aiplatform**-psc4googep.p**.googleapis.com. Esto se alinea con el formato de API específico de PSC <service>-<endpointname>.p.googleapis.com.

Desde un notebook de JupyterLab

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

Desde un notebook de JupyterLab

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

Desde un notebook de 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)

Respuesta de muestra:

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

Verifica TCPdump

Vuelve a la terminal y busca llamadas al extremo de PSC (10.100.100.0). Finaliza el TCPdump (control+c).

Resultado de muestra

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

Operación exitosa

11. Pasos para la limpieza

Cierra el notebook de JupyterLab y regresa a Cloud Shell. Asegúrate de que Cloud Shell no haya agotado el tiempo de espera. Si es así, restablece tus variables.

Desde 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

Borra todos los recursos.

Desde 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. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Crea un concentrador de NCC.
  • Configura radios de VPC en un concentrador de NCC.
  • Crea una VPN con alta disponibilidad de Cloud.
  • Configura radios híbridos en un concentrador de NCC.
  • Crea un extremo de PSC para las APIs de Google.
  • Configura una ruta personalizada a través de la VPN con alta disponibilidad.
  • Configura una zona de intercambio de tráfico de DNS.
  • Configura una instancia de Vertex Workbench
  • Configura el código de Python de Gemini para usar un extremo de la API de PSC para las APIs de Google.