Доступ к чату 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. Цель

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

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

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

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

Запустить Cloud Shell

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

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

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

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

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

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

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. После того, как вы подключитесь по SSH к py-vm1, включите 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 authorization code: вставьте скопированный вами код и нажмите Enter для аутентификации.

b703db7aa2aa286a.png

  1. Теперь давайте проведем быстрый тест, чтобы увидеть, можем ли мы подключиться к API Vertex. Он использует * -aiplatform.googleapis.com , поэтому мы выполним dig по этому адресу, чтобы увидеть, как маршрутизируется трафик.
dig *-aiplatform.googleapis.com
  1. Вы должны увидеть что-то похожее (адрес будет другим). Обратите внимание, что путь проложен через публичные IP-адреса, поскольку 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. Теперь скопируйте и вставьте следующий текст. Этот текст спрашивает Gemini: « Какие цвета у логотипа 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. Этот запрос был получен через публичный API Vertex.
  3. Закройте сеанс SSH и продолжим.

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

Чтобы обеспечить приватное подключение к нашей конечной точке API Vertex, мы создадим приватную конечную точку подключения к сервисам для 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 . Добавьте в файл следующий код.

Терраформировать 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 Это покажет, что будут добавлены два элемента.
    затем запустите terraform apply и введите yes чтобы создать конечную точку IP и PSC Google API.
  2. Проверить существование конечной точки
gcloud compute addresses list --filter="name=( 'vertex-ip' ...)"
gcloud compute forwarding-rules describe pscvertexgemini --global

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

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

  1. Перейдите в раздел Сетевые службы и выберите Cloud DNS.
  2. В разделе «Зоны» вы увидите автоматически созданную зону для Private Service Connect для API Google с типом зоны «Каталог сервисов». Её можно использовать для подключения к конечной точке 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. Добавьте в файл следующий код.

Терраформ 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. Перейдите к экземпляру виртуальной машины 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-запись для PSC Google API с помощью 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. Активируйте env с помощью
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 для API Google. Эта функция позволяет расширить возможности частного API в вашей локальной или другой облачной среде, подключенной через (Interconnect, Cross-Cloud Interconnect и VPC).

Дальнейшие шаги / Узнать больше

Подробнее о сетях Vertex AI можно прочитать здесь.

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

Возьмите вашу следующую лабораторную работу

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