Использование Private Service Connect для API Google для доступа к Gemini через гибридное соединение

1. Введение

Private Service Connect for Google APIs (PSC) — это сетевая функция Google Cloud, позволяющая пользователям настраивать частный доступ через глобальную конечную точку с частным IP-адресом внутри VPC. Для пользователей, запускающих код или клиентские приложения в гибридной среде, подключенной к Google Cloud через VPN или Interconnect, PSC используется для разрешения API Google через это частное гибридное соединение.

PSC для API Google может разрешать множество различных доменов, полный список которых можно найти здесь . Домен, который использует большинство API Google, — это <API>.googleapis.com. Наряду с этим доменом, PSC также предоставляет пользователям версию googleapis.com, которая имеет вид <API>-<PSC-ENDPOINT-NAME>.**p.**googleapis.com. Используя этот домен, пользователи могут настраивать приложения для использования определенных конечных точек PSC. Наиболее распространенный вариант использования позволяет пользователям выбирать, какие приложения используют конечную точку PSC для маршрутизации трафика API Google через гибридное соединение, в то время как другие приложения продолжают маршрутизировать трафик к общедоступной конечной точке API.

Gemini входит в пакет продуктов Vertex AI от Google Cloud и включен в список API Google, которые можно разрешить с помощью PSC для API Google.

В этом практическом занятии вы создадите смоделированную гибридную среду, разместив экземпляр Workbench локально и запустив код Gemini на Python, который будет обращаться к API Gemini в приватном режиме через VPN высокой доступности, подключаясь к конечной точке PSC для API Google.

Что вы узнаете

  • Создайте NCC-хаб.
  • Настройка VPC Spokes в NCC Hub.
  • Создайте облачную VPN-сеть высокой доступности.
  • Настройка гибридных периферийных устройств в хабе NCC.
  • Создайте конечную точку PSC для API Google.
  • Настройте пользовательский маршрут через HA-VPN.
  • Настройте зону DNS-пиринга.
  • Настройка экземпляра Vertex Workbench
  • Настройте код Gemini на Python для использования конечной точки API PSC для Google API.

Что вам понадобится

  • Проект Google Cloud с правами "Владелец" или полными правами "Редактор".

2. Топология Codelab

74f1027c8c8085f6.png

В этом практическом занятии вы будете использовать Google Cloud для имитации гибридной среды. В этом занятии будут шаги, специфичные для Google Cloud, которые будут отличаться при настройке в реальной локальной среде. Эти шаги будут отмечены.

Вы создадите NCC Hub, в котором маршрутизирующая VPC будет выступать в качестве периферийной VPC (VPC Spoke). В этой VPC будет настроена HA-VPN для подключения к локальной VPC, что имитирует локальную среду. HA-VPN будет настроена как гибридная периферийная VPC в NCC Hub. В локальной VPC вы создадите подсеть, где будет размещен экземпляр Workbench. Вы также создадите облачный NAT для загрузки пакетов на экземпляр Workbench.

Наконец, вам нужно будет создать зону DNS-пиринга для локальной VPC, чтобы иметь возможность использовать частную зону каталога служб для p.googleapis.com, которую PSC для Google APIs создает автоматически.

3. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

55efc1aaa7a4d3ad.png

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

7ffe5cbb04455448.png

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.

4. Прежде чем начать

Включить API

Внутри Cloud Shell убедитесь, что ваш проект настроен правильно, и задайте переменные среды.

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

Включите все необходимые API Google в проекте.

Из 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. Создайте VPC и подсети.

Создавайте сети

Из Cloud Shell

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

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

Создание облачных маршрутизаторов и облачного NAT

Создайте облачный маршрутизатор, который будет использоваться совместно с VPN высокой доступности в маршрутизирующей VPC.

Из Cloud Shell

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

Создайте облачный маршрутизатор, который будет использоваться совместно с VPN высокой доступности в локальной VPC.

Из Cloud Shell

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

Создайте облачный маршрутизатор, который будет использоваться совместно с облачным NAT в локальной VPC.

Из Cloud Shell

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

Облачный NAT в локальной VPC будет использоваться для загрузки пакетов в экземпляр Vertex AI Workbench, который будет настроен на более позднем этапе.

Из 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. Создайте облачное VPN-соединение высокой доступности (Ha-VPN).

Создайте VPN-шлюзы.

Из Cloud Shell

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

Из Cloud Shell

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

Создайте VPN-туннели, исходящие из маршрутизирующей VPC.

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

Создайте VPN-туннели, исходящие из локальной VPC.

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

Настройте BGP-сессии для двух туннелей, исходящих из маршрутизирующего VPC.

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

Настройте BGP-сессии для двух туннелей, исходящих из локальной VPC.

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

Перейдите на страницу «Сетевое подключение > VPN» в консоли и убедитесь, что ваши туннели HA-VPN и сессии BGP настроены правильно.

7. Настройка центрального узла и периферийных устройств NCC.

Создать центр NCC

Из Cloud Shell

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

Создать спицы NCC

Для корректной работы NCC gcloud требуется, чтобы все периферийные узлы были настроены с указанием полных путей или URI.

Из Cloud Shell

gcloud compute networks describe routing-vpc

Обратите внимание на полный путь (URI) к routing-vpc для следующей команды.

Пример выходных данных

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

Настройка маршрутизации VPC Spoke

Из Cloud Shell

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

Из Cloud Shell

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

Обратите внимание на полные пути (URI) VPN-туннелей, исходящих из маршрутизирующей VPC.

Пример выходных данных

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

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

Перед тем как продолжить, убедитесь, что все спицы настроены правильно.

Из Cloud Shell

gcloud network-connectivity hubs list-spokes ncc-hub

Пример выходных данных

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. Настройка Private Service Connect для API Google.

Конечные точки PSC для API Google создаются на основе глобальных IP-адресов, которые не находятся в региональной подсети VPC. Глобальный IP-адрес должен быть специально зарезервирован для назначения PRIVATE_SERVICE_CONNECT.

Из Cloud Shell

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

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

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

Из 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. Настройка экземпляра Vertex Workbench

Создайте учетную запись службы, которая будет использоваться в качестве идентификатора экземпляра Workbench.

Из Cloud Shell

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

Запишите полное имя вашей учетной записи службы и предоставьте ей разрешение aiplatform.admin на выполнение вызовов к Vertex AI/Gemini.

Из Cloud Shell

gcloud iam service-accounts list

Пример выходных данных

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

Убедитесь, что вы заменили <your-project-id> на фактический идентификатор вашего проекта. Мы не можем использовать переменную $project здесь из-за необходимости использования кавычек.

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

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

Подготовка экземпляра Workbench может занять больше времени, чем выполняется команда gcloud.

10. Проверьте код Gemini.

В пользовательском интерфейсе нажмите «Открыть JupyterLab».

1b7ff959f1072aaa.png

После входа в JupyterLab откройте новый блокнот Python 3.

18c26d06183faca1.png

Запустите следующий код в блокноте. Убедитесь, что вы обновили код, добавив информацию о вашем конкретном проекте и регионе.

Из блокнота JupyterLab

pip install --upgrade google-genai

Перезапустите ядро ​​ноутбука.

fe7911ce8b54ff8a.png

Обратите внимание на конечную точку API. Здесь мы используем конечную точку API <ВАШ_РЕГИОН>-aiplatform.googleapis.com. Это стандартная конечная точка API для Vertex AI.

Из блокнота 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,
)

Из блокнота 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)

Пример ответа

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.

Обратите внимание на имя API, которое вы использовали при запуске кода. YOUR_REGION-aiplatform.googleapis.com — это имя API по умолчанию для Vertex AI. Нам нужно изменить имя API и запустить код снова. Мы можем убедиться, что код использует конечную точку PSC, запустив TCPdump в терминале на экземпляре Workbench.

Запустите TCPdump в терминале.

Чтобы открыть терминал в Workbench, нажмите Файл > Создать > Терминал.

2cc405367de1f4c2.png

Если у вас возникли проблемы с отображением текста в терминале, вам необходимо обновить тему оформления терминала. Сделайте это в разделе «Настройки» > «Тема терминала» > «Светлая» или «Темная».

Из терминала

sudo tcpdump host 10.100.100.0

Обновить код Gemini

Вернитесь в блокнот, обновите конечную точку API и снова запустите код. Обратите внимание, что мы изменили конечную точку API на <ВАШ_РЕГИОН>-aiplatform**-psc4googep.p**.googleapis.com. Это соответствует формату API, специфичному для PSC: <сервис>-<имя_конечной_точки>.p.googleapis.com.

Из блокнота JupyterLab

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

Из блокнота JupyterLab

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

Из блокнота 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)

Пример ответа

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

Проверьте TCPdump

Вернитесь к терминалу и проверьте наличие вызовов к конечной точке PSC (10.100.100.0). Завершите TCPdump (Ctrl+C).

Пример выходных данных

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

УСПЕХ!

11. Этапы очистки

Закройте блокнот JupyterLab и вернитесь в Cloud Shell. Убедитесь, что время ожидания в Cloud Shell не истекло. Если это произошло, сбросьте переменные.

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

Удалить все ресурсы.

Из 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. Поздравляем!

Поздравляем с завершением практического занятия!

Что мы рассмотрели

  • Создайте NCC-хаб.
  • Настройка VPC Spokes в NCC Hub.
  • Создайте облачную VPN-сеть высокой доступности.
  • Настройка гибридных периферийных устройств в хабе NCC.
  • Создайте конечную точку PSC для API Google.
  • Настройте пользовательский маршрут через HA-VPN.
  • Настройте зону DNS-пиринга.
  • Настройка экземпляра Vertex Workbench
  • Настройте код Gemini на Python для использования конечной точки API PSC для Google API.