Доступ к чату Gemini 3 Pro с помощью Python SDK через конечную точку Private Service Connect

1. Обзор

Доступ к API Vertex AI можно получить через интернет , однако в вашей организации может потребоваться доступ к API Vertex AI в частном порядке, без использования интернета. В этой лабораторной работе вы сначала это сделаете.

  • Получите доступ к API Gemini 3 Pro через Vertex, используя Python SDK.
  • Это будет работать на виртуальной машине.
  • Подключение к общедоступному интернету будет осуществляться через Cloud NAT.

Затем вы создадите конечную точку Private Service Connect для подключения к API Google и измените поток трафика, чтобы использовать эту частную конечную точку для подключения к API чата Gemini. Конфигурации будут представлять собой комбинацию Terraform, gcloud и console.

В этой лабораторной работе вы создадите следующий узор.

Рисунок 1.

304c579d349aec90.png

2. Цель

В этой лабораторной работе вы научитесь выполнять следующее задание:

  • Настройте экземпляр виртуальной машины для использования SDK Python.
  • Подключитесь к чату Gemini с помощью скрипта на Python.
  • Настройте конечную точку PSC для подключения к Googleapis.
  • Проверьте путь подключения к Googleais
  • Настройка записей DNS вручную

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.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 на панели инструментов в правом верхнем углу:

Активировать Cloud Shell

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

Скриншот терминала Google Cloud Shell, показывающий, что среда подключена.

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

3. Задание 1. Настройка среды с помощью Terraform.

Мы создадим пользовательскую VPC с правилами брандмауэра и подсетью. Откройте консоль облака и выберите проект, который будете использовать.

  1. Откройте Cloud Shell, расположенный в верхней части консоли справа, убедитесь, что в Cloud Shell отображается правильный идентификатор проекта , и подтвердите все запросы на предоставление доступа. b51b80043d3bac90.png
  2. Создайте папку с именем terraform-build и перейдите в эту папку.
mkdir terraform-build  && cd terraform-build
  1. Создайте файлы main.tf и variable.tf .
touch main.tf variable.tf 
  1. Переключитесь в режим редактора Cloud Shell . Выберите редактор и убедитесь, что вы разрешили все необходимые запросы, чтобы интерфейс загрузился.
  2. После загрузки перейдите в меню «Файл» > «Открыть папку» и выберите папку /home/your-user-name/terraform-build , затем нажмите «ОК» , чтобы открыть папку в редакторе. 39b3eb9a3e077bfd.png
  3. Выберите файл variable.tf и добавьте следующее. Замените текст your-project-id-here на фактический идентификатор вашего проекта в кавычках.
variable "project_id" {
  type = string
  default = "your-project-id-here"
}

variable "network_id" {
  type = string
  default = "python-net"
}
  1. Далее откройте файл main.tf. Мы собираемся добавить в него код Terraform для выполнения различных действий, как описано ниже.

Включить API

resource "google_project_service" "default"

Создайте VPC с именем python-net.

resource "google_compute_network" "default"

Добавить подсеть

resource "google_compute_subnetwork" "default"

Добавьте два правила брандмауэра.

resource "google_compute_firewall" "allow_icmp"resource "google_compute_firewall" "allow_ssh"

  1. Скопируйте и вставьте следующий текст в основной файл .tf .
resource "google_project_service" "default" {
  project = var.project_id 
  for_each = toset([
    "dns.googleapis.com",
    "aiplatform.googleapis.com",
    "servicedirectory.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = false
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_subnetwork" "default" {
  name          = "vm1-subnet"
  ip_cidr_range = "10.0.11.0/24"
  project       = var.project_id
  region        = "us-east1"
  stack_type    = "IPV4_ONLY"
  network       = google_compute_network.default.id
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-icmp"]
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}
  1. Вернитесь в терминал Cloud Shell, убедитесь, что вы находитесь в каталоге terraform-build , cd terraform-build и выполните следующие команды.

terraform init

Инициализирует рабочий каталог. На этом шаге загружаются поставщики, необходимые для данной конфигурации.

terraform plan

Генерирует план выполнения, показывающий, какие действия Terraform предпримет для развертывания вашей инфраструктуры.

  1. Теперь, чтобы создать ресурсы, выполните команду terraform apply и введите yes для запуска.

4. Задание 2. Создание NAT-шлюза и виртуальных машин с помощью Terraform.

Нам необходимо разрешить исходящий внешний доступ к интернету, поэтому давайте создадим шлюз Cloud NAT и подключим его.

  1. Откройте Cloud Shell, перейдите в папку terraform-build и создайте следующие файлы (всего три файла). Мы отредактируем их позже.
touch nat-vm.tf psc.tf dns.tf
  1. Переключитесь в редактор Cloud Shell , выберите файл nat-vm.tf и добавьте следующий код Terraform. Это создаст NAT-шлюз и две виртуальные машины.

Terraform nat-vm.tf

resource "google_compute_router" "default" {
  name    = "py-outbound-nat"
  region  = "us-east1"
  network = google_compute_network.default.id
  project = var.project_id
  

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name                               = "py-outbound-nat-gw"
  router                             = google_compute_router.default.name
  region                             = google_compute_router.default.region
  nat_ip_allocate_option             = "AUTO_ONLY"
  project                            = var.project_id
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

  log_config {
    enable = true
    filter = "ERRORS_ONLY"
  }
}

resource "google_compute_instance" "vm1" {
  name         = "py-vm1"
  zone         = "us-east1-b"
  machine_type = "n2-standard-2"
  project      = var.project_id

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }

  network_interface {
    subnetwork = google_compute_subnetwork.default.id  
    stack_type = "IPV4_ONLY"
  }

  tags = ["allow-ssh", "allow-icmp"]

  metadata_startup_script = <<-EOF
    #! /bin/bash
    sudo apt-get update
    sudo apt-get install python3 python3-dev python3-venv git -y
    sudo apt-get install tcpdump dnsutils -y    
    
      mkdir -p ~/py-gem-env
      cd ~/py-gem-env
      python3 -m venv env
      source env/bin/activate
      pip install --upgrade pip
      pip install ipython google-genai
    '
  EOF
}
  1. Переключитесь на терминал Cloud Shell , убедитесь, что вы находитесь в папке terraform-build , и запустите terraform plan Она покажет, что будет добавлено 4 элемента. Затем запустите terraform apply и введите yes чтобы создать NAT-шлюз и виртуальную машину.

5. Задание 3. Настройка виртуальных машин и тестирование.

  1. Перейдите к экземплярам виртуальных машин. Выберите виртуальную машину, начинающуюся с py-vm1 . Выберите SSH .
  2. После подключения к py-vm1 по SSH, предоставьте права root, набрав команду sudo -i
  3. Активируйте свою виртуальную среду (venv):
cd py-gem-env
source env/bin/activate
  1. Теперь давайте проверим аутентификацию, чтобы провести тестирование позже. Выполните следующую команду в виртуальной машине и нажмите «y» , когда появится соответствующий запрос.
gcloud auth application-default login
  1. Далее скопируйте URL-адрес, который начинается с https://, откройте новую вкладку в окне браузера вашей лаборатории и вставьте URL-адрес. Подтвердите запросы.
  2. Когда вы увидите следующее поле «Выберите и скопируйте», вернитесь в сессию vm py-vm1 и в поле «Введите код авторизации» вставьте скопированный код и нажмите Enter для аутентификации.

b703db7aa2aa286a.png

  1. Теперь давайте проведём быстрый тест, чтобы проверить, можем ли мы подключиться к API Vertex. Для этого используется адрес * -aiplatform.googleapis.com , поэтому мы выполним команду dig по этому адресу, чтобы посмотреть, как распределяется трафик.
dig *-aiplatform.googleapis.com
  1. Вы должны увидеть что-то похожее (адрес будет отличаться). Обратите внимание, что путь проходит через публичные IP-адреса, поскольку API является публичным API. НЕ КОПИРОВАТЬ
; <<>> DiG 9.18.41-1~deb12u1-Debian <<>> *-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60947
;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;*-aiplatform.googleapis.com.   IN      A

;; ANSWER SECTION:
*-aiplatform.googleapis.com. 300 IN     A       173.194.216.95
*-aiplatform.googleapis.com. 300 IN     A       108.177.11.95
*-aiplatform.googleapis.com. 300 IN     A       192.178.219.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.134.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.139.95
*-aiplatform.googleapis.com. 300 IN     A       108.177.12.95
*-aiplatform.googleapis.com. 300 IN     A       173.194.210.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.26.95
*-aiplatform.googleapis.com. 300 IN     A       173.194.212.95
*-aiplatform.googleapis.com. 300 IN     A       172.217.204.95
  1. Теперь давайте воспользуемся Python. Введите ipython , чтобы активировать интерфейс IPython .
ipython

845ef4291429888a.png

  1. Теперь скопируйте и вставьте следующее. В этом задании для Близнецов задаются вопросы: « Какие цвета у логотипа Google ?» и « Какого цвета небо ?».
from google import genai
from google.genai import types
import os
import sys

LOCATION = "global"
MODEL_ID = "gemini-3-pro-preview" 

try:
    client = genai.Client(vertexai=True, location=LOCATION)
    print(f"Successfully initialized Google Gen AI Client (Vertex AI mode) in {LOCATION}")
except Exception as e:
    print(f"Error initializing client: {e}")
    print("Ensure you have installed the library: `pip install google-genai`")
    print("And authenticated: `gcloud auth application-default login`")
    sys.exit(1)

class SimpleChatSession:
    def __init__(self, model_id):
        self.model_id = model_id
        self.history = [] 

    def send_message(self, prompt, stream=True):
        user_content = types.Content(
            role="user",
            parts=[types.Part(text=prompt)]
        )
        self.history.append(user_content)

        try:
            response_stream = client.models.generate_content_stream(
                model=self.model_id,
                contents=self.history,
                config=types.GenerateContentConfig(
                    temperature=0.7 
                )
            )

            accumulated_text = ""
            
            for chunk in response_stream:
                if chunk.text:
                    yield chunk.text
                    accumulated_text += chunk.text
            
            model_content = types.Content(
                role="model",
                parts=[types.Part(text=accumulated_text)]
            )
            self.history.append(model_content)

        except Exception as e:
            print(f"\n[Error during generation: {e}]")

def get_chat_response(session: SimpleChatSession, prompt: str):
    print(f"\n--- User: {prompt} ---")
    print("--- Model: ", end="")
    
    stream_generator = session.send_message(prompt)
    
    full_text = ""
    for chunk_text in stream_generator:
        full_text += chunk_text
        print(chunk_text, end="", flush=True)

    print() 
    return full_text

if __name__ == "__main__":
    chat_session = SimpleChatSession(MODEL_ID)

    get_chat_response(chat_session, "Hello.")
    get_chat_response(chat_session, "What are all the colors of the Google logo?")
    get_chat_response(chat_session, "What color is the sky?")
  1. Нажмите Enter дважды, чтобы запустить программу и увидеть результат.
  2. Данный запрос обращался к Vertex через публичный API.
  3. Завершим SSH- сессию, продолжим.

6. Задание 4. Создайте конечную точку PSC для googleapis с помощью Terraform.

Для обеспечения частного подключения к нашей конечной точке API Vertex мы создадим конечную точку Private Service Connect для API Google. Это позволит нам использовать назначенный нами частный IP-адрес для маршрутизации трафика к необходимым нам API Google, в данном случае Vertex.

  1. Откройте Cloud Shell в режиме редактора, если он еще не открыт. Мы собираемся создать следующее:
  • Создайте IP-адрес для конечной точки PSC 192.168.255.250 ( resource "google_compute_global_address" "default")
  • Создайте конечную точку PSC для API Google ( resource "google_compute_global_forwarding_rule" "default")

Откройте файл psc.tf в папке terraform-build . Добавьте в него следующий код.

Terraform psc.tf

resource "google_compute_global_address" "default" {
  name         = "vertex-ip"
  purpose      = "PRIVATE_SERVICE_CONNECT"
  network      = google_compute_network.default.id
  address_type = "INTERNAL"
  address      = "192.168.255.250"
}

resource "google_compute_global_forwarding_rule" "default" {  
  name                  = "pscvertexgemini"
  target                = "all-apis"
  network               = google_compute_network.default.id
  ip_address            = google_compute_global_address.default.id
  load_balancing_scheme = ""
  }
  1. Переключитесь на терминал Cloud Shell , убедитесь, что вы находитесь в папке terraform-build . Затем выполните команду terraform init , после чего выполните terraform plan Это покажет, что будут добавлены 2 элемента.
    Затем запустите terraform apply и введите yes , чтобы создать конечные точки Google API для IP-адреса и PSC.
  2. Проверьте существование конечной точки.
gcloud compute addresses list --filter="name=( 'vertex-ip' ...)"
gcloud compute forwarding-rules describe pscvertexgemini --global

7. Задание 5. Создание записи DNS вручную для googleapis с помощью Terraform.

Вы можете создать запись DNS вручную, указывающую на конечную точку PSC, используя частный DNS. Это повлияет на все сети, которые вы к ней назначите.

  1. Перейдите в раздел «Сетевые службы» и выберите «Облачный DNS».
  2. В разделе «Зоны» вы должны увидеть автоматически созданную зону для Private Service Connect for Google APIs с типом зоны «каталог служб». Ее можно использовать для подключения к конечной точке PSC в формате ** SERVICE-ENDPOINT **. p.googleapis.com Пример: aiplatform-pscvertexgemini.p.googleapis.com
  3. В данном случае нам нужно вручную создать частную DNS-запись. Конфигурация будет следующей:
  • Создайте частную DNS-зону с именем "googleapis-private" для "googleapis.com" и ограничьте ее доступом только для сети "python-net".
  • Добавьте запись типа A, чтобы сопоставить "googleapis.com" с IP-адресом "192.168.255.250".
  • Добавьте запись CNAME для перенаправления всех поддоменов "googleapis.com" (например, www.googleapis.com) на "googleapis.com".
  1. Откройте Cloud Shell в режиме редактора, если он еще не открыт. Откройте файл dns.tf в папке terraform-build. Добавьте в файл следующий код.

Terraform dns.tf

resource "google_dns_managed_zone" "private_zone" {
  name        = "googleapis-private"
  dns_name    = "googleapis.com."  
  visibility  = "private"
  project     = var.project_id     

  private_visibility_config {
    networks {
      network_url = google_compute_network.default.id  
    }
  }
}

resource "google_dns_record_set" "a_record" {
  name    = "googleapis.com."  
  type    = "A"
  ttl     = 300
  managed_zone = google_dns_managed_zone.private_zone.name
  project = var.project_id    

  rrdatas = ["192.168.255.250"]
}

resource "google_dns_record_set" "cname_record" {
 name    = "*.googleapis.com."
 type    = "CNAME"
 ttl     = 300
 managed_zone = google_dns_managed_zone.private_zone.name
 project = var.project_id    

 rrdatas = ["googleapis.com."]  
}
  1. Переключитесь на терминал Cloud Shell , убедитесь, что вы находитесь в папке terraform-build . Затем запустите terraform plan , которая покажет вам, какие элементы будут добавлены.
    Затем запустите terraform apply и введите yes чтобы создать частную запись DNS.
  2. Вы должны увидеть конфигурацию с записью A и записью CNAME, примерно такую: 6d2fc061460cd983.png
  3. Далее мы проверим подключение с помощью этих изменений в py-vm1.

8. Задание 6. Проверка подключения конечной точки по IP-адресу.

Давайте подключимся к Gemini, используя частную конечную точку.

  1. Перейдите в раздел VM Instance py-vm1 . Выберите SSH и подключитесь к виртуальной машине по SSH.
  2. Получите права root, набрав команду sudo -i
  3. Проверьте путь подключения к aiplatform.googleapis.com с помощью команды ping . Эта команда отправит ping на IP-адрес в частной DNS-записи A для googleapis. Этот IP-адрес является конечной точкой PSC, и ваши ping-запросы будут неудачными.
ping -c 2 aiplatform.googleapis.com
  1. Проверьте путь подключения с помощью ping , используя автоматически созданную запись DNS для API Google PSC с адресом aiplatform-pscvertexgemini.p.googleapis.com . Эта запись указывает на IP-адрес конечной точки PSC, и ваши команды ping будут неуспешными.
ping -c 2 aiplatform-pscvertexgemini.p.googleapis.com
  1. Проверьте путь подключения к aiplatform.googleapis.com с помощью команды dig . Это должен быть IP-адрес конечной точки PSC.
dig aiplatform.googleapis.com
  1. Вернитесь в консоль и откройте другой экземпляр виртуальной машины py-vm1 . Выберите SSH и подключитесь к виртуальной машине по SSH.
  2. Получите права root, набрав команду sudo -i
  3. Выполните следующую команду, чтобы увидеть состояние подключения в дампе TCP.
sudo tcpdump -i any port 53 -n or host aiplatform.googleapis.com
  1. Теперь вернитесь к первому SSH-экземпляру виртуальной машины py-vm1.
  2. Активируйте среду, используя
cd py-gem-env
source env/bin/activate
  1. Теперь давайте протестируем Python. Введите ipython , чтобы активировать интерфейс ipython .
ipython
  1. Теперь скопируйте и вставьте следующее. В этом задании для Gemini задаются вопросы: « В одном коротком предложении кратко изложите, что такое токенизатор в контексте ИИ? » и « Киты — это круто или нет? ».
from google import genai
from google.genai import types
import os
import sys

LOCATION = "global"
MODEL_ID = "gemini-3-pro-preview" 

try:
    client = genai.Client(vertexai=True, location=LOCATION)
    print(f"Successfully initialized Google Gen AI Client (Vertex AI mode) in {LOCATION}")
except Exception as e:
    print(f"Error initializing client: {e}")
    print("Ensure you have installed the library: `pip install google-genai`")
    print("And authenticated: `gcloud auth application-default login`")
    sys.exit(1)

class SimpleChatSession:
    def __init__(self, model_id):
        self.model_id = model_id
        self.history = [] 

    def send_message(self, prompt, stream=True):
        user_content = types.Content(
            role="user",
            parts=[types.Part(text=prompt)]
        )
        self.history.append(user_content)

        try:
            response_stream = client.models.generate_content_stream(
                model=self.model_id,
                contents=self.history,
                config=types.GenerateContentConfig(
                    temperature=0.7 
                )
            )

            accumulated_text = ""
            
            for chunk in response_stream:
                if chunk.text:
                    yield chunk.text
                    accumulated_text += chunk.text
            
            model_content = types.Content(
                role="model",
                parts=[types.Part(text=accumulated_text)]
            )
            self.history.append(model_content)

        except Exception as e:
            print(f"\n[Error during generation: {e}]")

def get_chat_response(session: SimpleChatSession, prompt: str):
    print(f"\n--- User: {prompt} ---")
    print("--- Model: ", end="")
    
    stream_generator = session.send_message(prompt)
    
    full_text = ""
    for chunk_text in stream_generator:
        full_text += chunk_text
        print(chunk_text, end="", flush=True)

    print() 
    return full_text

if __name__ == "__main__":
    chat_session = SimpleChatSession(MODEL_ID)

    get_chat_response(chat_session, "Hello.")
    get_chat_response(chat_session, "In one short sentence summarize what is a tokenizer in the context of AI?")
    get_chat_response(chat_session, "Are whales awesome or not?")
  1. Нажмите Enter дважды, чтобы запустить программу и увидеть результат.
  2. Переключитесь обратно на второй экземпляр виртуальной машины py-vm1. Вы должны увидеть результат команды TCPDUMP. Вы заметите, что входящие и исходящие соединения происходят по IP-адресу виртуальной машины, который использует IP-адрес конечной точки PSC для подключения к aiplatform.googleapis.com.

Закрыть все SSH-сессии с экземпляром виртуальной машины py-vm1

9. Уборка

  1. Перейдите в Cloud Shell , убедитесь, что вы находитесь в каталоге terraform-build, затем cd terraform-build
  2. Запустите команду terraform plan destroy , чтобы увидеть все изменения, которые будут внесены.
terraform plan -destroy
  1. Затем выполните команду terraform destroy , введите yes , и все ресурсы, созданные в вашем проекте с помощью Terraform, будут удалены.
terraform destroy 

10. Поздравляем!

Поздравляем, вы успешно подключились к Vertex и использовали Gemini 3 Pro через публичный API-адрес, а также в приватном режиме с помощью Private Service Connect Endpoint для Google API. Эта функциональность позволяет расширить возможности подключения к приватным API в вашей локальной/другой облачной среде, подключенной через (межоблачное соединение, межоблачное соединение и VPC).

Следующие шаги / Узнать больше

Вы можете узнать больше о сетевых технологиях Vertex AI.

Codelab: Доступ к Anthropic Claude на Vertex AI с помощью Python SDK через конечную точку Private Service Connect.

Пройдите следующую лабораторную работу.

Продолжите свое знакомство с Google Cloud и ознакомьтесь с другими лабораторными работами Google Cloud Skills Boost: