1. Введение
Интерфейс Private Service Connect — это ресурс, позволяющий сети виртуальной частной сети (VPC) производителя инициировать соединения с различными пунктами назначения в сети VPC потребителя. Сети производителя и потребителя могут находиться в разных проектах и организациях.
Если сетевое соединение принимает подключение от интерфейса Private Service Connect, Google Cloud выделяет этому интерфейсу IP-адрес из подсети потребителя, указанной в сетевом соединении. Сети потребителя и производителя соединяются и могут обмениваться данными, используя внутренние IP-адреса.
Соединение между сетевым устройством и интерфейсом Private Service Connect аналогично соединению между конечной точкой Private Service Connect и сервисным устройством, но имеет два ключевых отличия:
- Сетевое подключение позволяет сети-производителю инициировать соединения с сетью-потребителем (исходящий трафик управляемых сервисов), а конечная точка позволяет сети-потребителю инициировать соединения с сетью-производителем (входящий трафик управляемых сервисов).
- Соединение через интерфейс Private Service Connect является транзитивным. Это означает, что сеть-производитель может взаимодействовать с другими сетями, подключенными к сети потребителя.
Вопросы доступности интерфейса PSC в Vertex AI
- PSC-Interface способен маршрутизировать трафик к адресам в VPC или локальной сети в пределах адресного блока RFC1918.
- Для работы PSC-интерфейса с блоками адресов, отличными от RFC-1918, требуется явное развертывание прокси-сервера в VPC потребителя с адресом RFC-1918. В развертывании Vertex AI прокси-сервер должен быть определен вместе с полным доменным именем (FQDN) целевой конечной точки. На рисунке 1 показан явный прокси-сервер, настроенный в VPC клиентов для обеспечения маршрутизации к следующим CIDR, отличным от RFC-1918:
[1] 240.0.0.0/4
[2] 203.0.113.0/2
[3]10.10.20.0/28, прокси не требуется, попадает в диапазон rfc1918.
- При настройке развертывания только с использованием интерфейса PSC сохраняется доступ к интернету по умолчанию. Исходящий трафик проходит напрямую из защищенной сети арендатора, управляемой Google.

Вопросы, касающиеся интерфейса Vertex AI PSC и VPC-SC.
- Когда ваш проект является частью периметра VPC Service Controls, доступ к интернету по умолчанию для арендаторов, управляемых Google, блокируется периметром, чтобы предотвратить утечку данных.
- Чтобы обеспечить развертыванию доступ к общедоступному интернету в этом сценарии, необходимо явно настроить безопасный исходящий путь, который направляет трафик через вашу VPC. Рекомендуемый способ сделать это — настроить прокси-сервер внутри периметра вашей VPC с адресом RFC1918 и создать шлюз Cloud NAT, чтобы разрешить виртуальной машине-прокси доступ к интернету.
Для получения дополнительной информации обратитесь к следующим ресурсам:
Настройка интерфейса Private Service Connect для ресурсов Vertex AI | Google Cloud
Что вы построите
В этом руководстве вы создадите комплексную систему развертывания Vertex AI Pipelines с использованием интерфейса Private Service Connect (PSC), обеспечивающего связь между производителем и вычислительными ресурсами потребителя, как показано на рисунке 1, с ориентацией на конечные точки, не соответствующие стандарту RFC-1928.
Рисунок 2

Вам потребуется создать единое сетевое соединение psc-network-attachment в потребительской VPC, используя DNS-пиринг для разрешения имен виртуальных машин потребителей в проекте арендатора, на котором размещено обучение Vertex AI, что приведет к следующим сценариям использования:
- Разверните Vertex AI Pipelines и настройте прокси-виртуальную машину, чтобы она выступала в качестве явного прокси, позволяя ей выполнять команду wget к виртуальной машине в подсети класса E.
Что вы узнаете
- Как создать сетевое подключение
- Как производитель может использовать сетевое подключение для создания интерфейса PSC
- Как установить связь между производителем и потребителем с помощью DNS-пиринга
- Как установить связь с адресным пространством IP, не входящим в RFC1918, из Vertex AI Pipelines
Что вам понадобится
Проект Google Cloud
Разрешения IAM
- Администратор вычислительной сети (roles/compute.networkAdmin)
- Администратор вычислительного экземпляра (roles/compute.instanceAdmin)
- Администратор безопасности вычислительных ресурсов (roles/compute.securityAdmin)
- Администратор DNS (roles/dns.admin)
- Пользователь туннеля, защищенный IAP (roles/iap.tunnelResourceAccessor)
- Ведение логов (roles/logging.admin)
- Администратор блокнотов (roles/notebooks.admin)
- Администратор IAM проекта (roles/resourcemanager.projectIamAdmin)
- Администратор учетной записи службы (roles/iam.serviceAccountAdmin)
- Администратор использования сервиса (roles/serviceusage.serviceUsageAdmin)
2. Прежде чем начать
Обновите проект, чтобы он соответствовал учебному пособию.
В этом руководстве переменные `$variables` используются для упрощения настройки gcloud в Cloud Shell.
Внутри Cloud Shell выполните следующие действия:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
Включение API
Внутри Cloud Shell выполните следующие действия:
gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "dns.googleapis.com"
gcloud services enable "notebooks.googleapis.com"
gcloud services enable "storage.googleapis.com"
gcloud services enable "cloudresourcemanager.googleapis.com"
gcloud services enable "artifactregistry.googleapis.com"
gcloud services enable "cloudbuild.googleapis.com"
3. Настройка потребителя
Создайте потребительскую VPC.
Внутри Cloud Shell выполните следующие действия:
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
Создайте потребительские подсети
Внутри Cloud Shell выполните следующие действия:
gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1
Внутри Cloud Shell выполните следующие действия:
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1
Создайте подсеть подключения к частной сети (Private Service Connect Network Attachment).
Внутри Cloud Shell выполните следующие действия:
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
Настройка облачного маршрутизатора и NAT.
В этом руководстве Cloud NAT используется для обеспечения доступа в интернет для виртуальной машины-прокси, которая не имеет публичного IP-адреса. Cloud NAT позволяет виртуальным машинам только с частными IP-адресами подключаться к интернету, что дает им возможность выполнять такие задачи, как установка программных пакетов.
Внутри Cloud Shell создайте облачный маршрутизатор.
gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1
Внутри Cloud Shell создайте NAT-шлюз.
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1 --enable-logging --log-filter=ALL
4. Включите IAP.
Чтобы разрешить IAP подключаться к вашим виртуальным машинам, создайте правило брандмауэра, которое:
- Применяется ко всем экземплярам виртуальных машин, к которым вы хотите обеспечить доступ с помощью IAP.
- Разрешает входящий трафик из диапазона IP-адресов 35.235.240.0/20. Этот диапазон содержит все IP-адреса, которые IAP использует для пересылки TCP-трафика.
Внутри Cloud Shell создайте правило брандмауэра IAP.
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
5. Создайте экземпляры виртуальных машин для потребителей.
Внутри Cloud Shell создайте экземпляр виртуальной машины потребителя, класс e-vm.
gcloud compute instances create class-e-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=class-e-subnet \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Class-e server !!' | tee /var/www/html/index.html
EOF"
В Cloud Shell создайте экземпляр виртуальной машины потребителя, proxy-vm, который будет служить явным прокси для Vertex AI Pipelines. В качестве приложения для проксирования HTTP-трафика мы будем использовать tinyproxy, хотя HTTPS также поддерживается.
gcloud compute instances create proxy-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--can-ip-forward \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=rfc1918-subnet1 \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install tinyproxy -y
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'proxy server !!' | tee /var/www/html/index.html
EOF"
6. Подключение к сети Private Service Connect
Сетевые подключения — это региональные ресурсы, представляющие собой потребительскую сторону интерфейса Private Service Connect. Вы связываете одну подсеть с сетевым подключением, а производитель назначает IP-адреса интерфейсу Private Service Connect из этой подсети. Подсеть должна находиться в том же регионе, что и сетевое подключение. Сетевое подключение должно находиться в том же регионе, что и служба производителя.
Создайте сетевое подключение.
Внутри Cloud Shell создайте сетевое подключение.
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_AUTOMATIC \
--subnets=intf-subnet
Перечислите сетевые подключения.
Внутри Cloud Shell отобразите список сетевых подключений.
gcloud compute network-attachments list
Опишите сетевые подключения.
Внутри Cloud Shell опишите сетевое подключение.
gcloud compute network-attachments describe psc-network-attachment --region=us-central1
Запишите имя psc-network-attachment, которое будет использоваться производителем при создании интерфейса Private Service Connect.
Чтобы просмотреть URL-адрес сетевого подключения PSC в консоли Cloud Console, перейдите по следующей ссылке:
Сетевые службы → Подключение к частной сети → Подключение к сети → psc-network-attachment

7. Частная DNS-зона
Вы создадите зону Cloud DNS для demo.com и заполните её записями A, указывающими на IP-адреса ваших виртуальных машин. Позже в задании Vertex AI Pipelines будет развернут DNS-пиринг, который позволит ему получить доступ к DNS-записям потребителя.
Внутри Cloud Shell выполните следующие действия:
gcloud dns --project=$projectid managed-zones create private-dns-codelab --description="" --dns-name="demo.com." --visibility="private" --networks="https://compute.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc"
Внутри Cloud Shell выполните команду `describe` для экземпляров виртуальных машин, чтобы получить соответствующие IP-адреса.
gcloud compute instances describe class-e-vm --zone=us-central1-a | grep networkIP:
gcloud compute instances describe proxy-vm --zone=us-central1-a | grep networkIP:
Внутри Cloud Shell создайте набор записей для виртуальной машины класса e-vm, обязательно обновите IP-адрес в соответствии с выводом вашей среды.
gcloud dns --project=$projectid record-sets create class-e-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="240.0.0.2"
Внутри Cloud Shell создайте набор записей для виртуальной машины proxy-vm и обязательно обновите IP-адрес в соответствии с выводом вашей среды.
gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"
Создайте правило облачного брандмауэра, разрешающее доступ через интерфейс PSC.
В следующем разделе создайте правило брандмауэра, разрешающее трафику, исходящему от сетевого подключения PSC, доступ к вычислительным ресурсам RFC1918 в VPC потребителей.
В Cloud Shell создайте правило входящего трафика брандмауэра, разрешающее доступ из подсети сетевого подключения PSC к виртуальной машине-прокси.
gcloud compute firewall-rules create allow-access-to-proxy \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--destination-ranges="10.10.0.0/19" \
--enable-logging
В Cloud Shell создайте правило входящего трафика брандмауэра, разрешающее доступ из подсети прокси-виртуальных машин в подсеть класса E.
gcloud compute firewall-rules create allow-access-to-class-e \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="10.10.10.0/28" \
--destination-ranges="240.0.0.0/4" \
--enable-logging
8. Обновите явный прокси-сервер.
В следующем разделе вам потребуется подключиться к явному прокси-серверу по SSH, обновить конфигурационный файл tinyproxy.conf, а затем выполнить сброс настроек.
Из Cloud Shell
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
Откройте конфигурационный файл tinyproxy, обновите его с помощью текстового редактора или любым другим удобным для вас способом. Ниже приведен пример с использованием VIM.
sudo vim /etc/tinyproxy/tinyproxy.conf
# Locate the "Listen" configuration line to restrict listening to only its private IP address of the Proxy-VM, rather than all interfaces.
Listen 10.10.10.2
# Locate the "Allow" configuration line to allow requests ONLY from the PSC Network Attachment Subnet
Allow 192.168.10.0/24
Save the configs by the following steps:
1. Press the `ESC` key to enter Command Mode.
2. Type `:wq` to save (w) and quit (q).
3. Press `Enter`
Restart the tinyproxy service to apply the changes:
sudo systemctl restart tinyproxy
Validate the tinyproxy service is running:
sudo systemctl status tinyproxy
Perform an exit returning to cloud shell
exit
9. Создайте блокнот Jupyter.
В следующем разделе описано, как создать блокнот Jupyter. Этот блокнот будет использоваться для развертывания задания Vertex AI Pipelines, которое отправляет команду wget из Vertex AI Pipelines на тестовые экземпляры. Путь передачи данных между Vertex AI Pipelines и потребительской сетью, содержащей экземпляры, использует сетевой интерфейс Private Service Connect.
Создайте управляемую пользователем учетную запись службы.
В следующем разделе вы создадите учетную запись службы, которая будет связана с экземпляром Vertex AI Workbench, используемым в этом руководстве.
В данном руководстве к учетной записи службы будут применены следующие роли:
- Администратор хранилища
- Пользователь Vertex AI
- Администратор реестра артефактов
- Редактор облачных сборок
- Пользователь учетной записи службы IAM
Внутри Cloud Shell создайте учетную запись службы.
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
Внутри Cloud Shell обновите учетную запись службы, присвоив ей роль администратора хранилища.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
Внутри Cloud Shell обновите учетную запись службы, присвоив ей роль «Пользователь Vertex AI».
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
Внутри Cloud Shell обновите учетную запись службы, присвоив ей роль администратора реестра артефактов.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
Внутри Cloud Shell обновите учетную запись службы, присвоив ей роль Cloud Build Editor.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
Внутри Cloud Shell разрешите учетной записи службы ноутбука использовать учетную запись службы Compute Engine по умолчанию.
gcloud iam service-accounts add-iam-policy-binding \
$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')-compute@developer.gserviceaccount.com \
--member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
10. Создайте экземпляр Vertex AI Workbench.
В следующем разделе создайте экземпляр Vertex AI Workbench, который будет использовать ранее созданную учетную запись службы notebook-sa.
Внутри Cloud Shell создайте экземпляр частного клиента.
gcloud workbench instances create workbench-tutorial --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=rfc1918-subnet1 --disable-public-ip --shielded-secure-boot=true --shielded-integrity-monitoring=true --shielded-vtpm=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com
11. Обновление агента службы Vertex AI
Компания Vertex AI действует от вашего имени для выполнения таких операций, как получение IP-адреса из подсети сетевого подключения PSC, используемой для создания интерфейса PSC. Для этого Vertex AI использует сервисного агента (указанного ниже), которому требуются права сетевого администратора .
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
Внутри Cloud Shell получите номер своего проекта.
gcloud projects describe $projectid | grep projectNumber
Внутри Cloud Shell получите номер своего проекта.
gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'
Внутри Cloud Shell укажите номер своего проекта.
projectnumber=YOUR-PROJECT-Number
В Cloud Shell создайте учетную запись службы для AI Platform. Пропустите этот шаг, если в вашем проекте уже есть учетная запись службы.
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
Внутри Cloud Shell обновите учетную запись агента службы, добавив ей роль compute.networkAdmin.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
Внутри Cloud Shell обновите учетную запись агента службы, добавив роль dns.peer.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"
Обновление учетной записи службы по умолчанию
Включите API Compute Engine и предоставьте вашей учетной записи службы по умолчанию доступ к Vertex AI. Обратите внимание, что для распространения изменений в доступе может потребоваться некоторое время.
Внутри Cloud Shell обновите учетную запись службы по умолчанию, добавив ей роль aiplatform.user.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
Внутри Cloud Shell обновите учетную запись службы по умолчанию, добавив ей роль storage.admin.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
Внутри Cloud Shell обновите учетную запись службы по умолчанию, добавив ей роль storage.admin.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. Включить Tcpdump
Для проверки IP-соединения от Vertex AI Pipelines мы можем использовать TCPDUMP. Это позволит нам наблюдать за обменом данными, исходящим из подсети PSC Network Attachment, 192.168.10.0/28, при отправке запроса get от Vertex AI Pipelines к виртуальной машине class-e-vm.demo.com (240.0.0.0/4).
Подключайтесь к виртуальной машине-прокси через SSH из Cloud Shell.
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
С операционной системы прокси-VM выполните фильтрацию tcpdump для виртуальной машины класса e и подсети подключения к сети PSC.
sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn
Откройте новую вкладку Cloud Shell, обновите переменную проекта и подключитесь к виртуальной машине класса e по SSH.
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
С операционной системы виртуальной машины класса e выполните фильтрацию tcpdump в подсети прокси-виртуальной машины.
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. Развертывание конвейеров искусственного интеллекта Vertex.
В следующем разделе вы создадите ноутбук для успешного выполнения команды wget из Vertex AI Pipelines к явному прокси-серверу. Это позволит вам получить доступ к виртуальным машинам, не соответствующим RFC 1918, таким как class-e-vm. Явный прокси-сервер не требуется для доступа Vertex AI Pipelines к rfc1918-vm, поскольку его целью является IP-адрес, соответствующий RFC 1918.
Запустите задачу обучения в экземпляре Vertex AI Workbench.
- В консоли Google Cloud перейдите на вкладку «Экземпляры» на странице Vertex AI Workbench.
- Рядом с именем вашего экземпляра Vertex AI Workbench (workbench-tutorial) нажмите «Открыть JupyterLab». Ваш экземпляр Vertex AI Workbench откроется в JupyterLab.
- Выберите Файл > Создать > Блокнот
- Выберите Ядро > Python 3
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
# Install gcloud
!pip install google-cloud
# Install the pipeline required packages
!pip install --upgrade google-cloud-aiplatform \
google-cloud-storage \
kfp \
google-cloud-pipeline-components
# Import libraries
from time import gmtime, strftime
import json
import requests
В блокноте JupyterLab создайте новую ячейку, обновите ее и выполните следующий код. Убедитесь, что вы обновили поле PROJECT_ID, указав данные вашей среды.
import json
import requests
import pprint
PROJECT_ID = 'YOUR-PROJECT-ID' #Enter your project ID
PROJECT_NUMBER=!gcloud projects list --filter="project_id:$PROJECT_ID" --format="value(PROJECT_NUMBER)"
PROJECT_NUMBER=str(PROJECT_NUMBER).strip('[').strip(']').strip("'")
print(PROJECT_NUMBER)
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
# us-central1 is used for the codelab
REGION = "us-central1" #@param {type:"string"}
SERVICE_NAME = "aiplatform" #@param {type:"string"}
SERVICE ="{}.googleapis.com".format(SERVICE_NAME)
ENDPOINT="{}-{}.googleapis.com".format(REGION, SERVICE_NAME)
API_VERSION = "v1" # @param {type: "string"}
LOCATION = REGION
В блокноте JupyterLab создайте новую ячейку и запустите приведенную ниже конфигурацию, обратите внимание на следующие моменты:
- proxy_server = "http://proxy-vm.demo.com:8888" Полное доменное имя (FQDN) связано с виртуальной машиной-прокси, развернутой в потребительской VPC. Для разрешения FQDN на более позднем этапе мы используем DNS-пиринг.
%%writefile main.py
import logging
import socket
import sys
import os
def make_api_request(url: str, proxy_vm_ip: str, proxy_vm_port: str):
"""
Makes a GET request to a non-rfc1918 API and saves the response.
Args:
url: The URL of the API to send the request to.
"""
import requests
try:
# response = requests.get(url)
proxy_server = f"http://proxy-vm.demo.com:8888" # replace with you VM's IP and proxy port.
proxies = {
"http": proxy_server,
"https": proxy_server,
}
response = requests.get(url, proxies=proxies)
logging.info(response.text)
response.raise_for_status() # Raise an exception for bad status codes
logging.info(f"Successfully fetched data from {url}")
except requests.exceptions.RequestException as e:
logging.error(f"An error occurred: {e}")
raise e
if __name__ == '__main__':
# Configure logging to print clearly to the console
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s',
stream=sys.stdout
)
url_to_test = os.environ['NONRFC_URL']
proxy_vm_ip = os.environ['PROXY_VM_IP']
proxy_vm_port = os.environ['PROXY_VM_PORT']
logging.info(f"url_to_test: {url_to_test}")
logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
logging.info(f"proxy_vm_port: {proxy_vm_port}")
make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
%%writefile Dockerfile
FROM python:3.9-slim
RUN apt-get update && \
apt-get install -y iputils-ping && \
apt-get install -y wget
RUN pip install cloudml-hypertune requests kfp
COPY main.py /main.py
ENTRYPOINT ["python3", "/main.py"]
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
IMAGE_PROJECT = PROJECT_ID
IMAGE_REPO = 'pipelines-test-repo-psc'
IMAGE_NAME = 'nonrfc-ip-call'
TAG = 'v1'
IMAGE_URI= f'us-central1-docker.pkg.dev/{IMAGE_PROJECT}/{IMAGE_REPO}/{IMAGE_NAME}:{TAG}'
IMAGE_URI
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
!gcloud auth configure-docker us-docker.pkg.dev --quiet
В блокноте JupyterLab создайте новую ячейку и выполните следующее. Если ошибка (gcloud.builds.submit) присутствует, проигнорируйте её.
!gcloud builds submit --tag {IMAGE_URI} --region=us-central1
В блокноте JupyterLab создайте и запустите ячейку, указанную ниже, обратите внимание на следующие моменты:
- Настройка DNS-пиринга с потребительскими VPC осуществляется с помощью dnsPeeringConfigs (dnsPeeringConfigs) для доменного имени demo.com.
- Явно заданный прокси-сервер, определяемый переменной PROXY_VM_IP, — это proxy-vm.demo.com. Разрешение имен осуществляется посредством DNS-пиринга внутри VPC потребителя.
- Порт 8888 — это порт прослушивания (по умолчанию), настроенный в tinyproxy.
- Запрос к class-e-vm-demo.com осуществляется через DNS-пиринг.
- В коде указан параметр "psc-network-attachment" для Vertex, позволяющий использовать подсеть сетевого подключения для развертывания двух экземпляров интерфейса PSC.
import json
from datetime import datetime
JOB_ID_PREFIX='test_psci-nonRFC' #@param {type:"string"}
JOB_ID = '{}_{}'.format(JOB_ID_PREFIX, datetime.now().strftime("%Y%m%d%H%M%S"))
# PSC-I configs
PRODUCER_PROJECT_ID = PROJECT_ID
DNS_DOMAIN = 'class-e-vm.demo.com' #@param {type:"string"}
NON_RFC_URL = f"http://{DNS_DOMAIN}"
PROXY_VM_IP = "proxy-vm.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8888" #@param {type:"string"}
CUSTOM_JOB = {
"display_name": JOB_ID,
"job_spec": {
"worker_pool_specs": [
{
"machine_spec": {
"machine_type": "n1-standard-4",
},
"replica_count": 1,
"container_spec": {
"image_uri": IMAGE_URI,
"env": [{
"name": "NONRFC_URL",
"value": NON_RFC_URL
},
{
"name": "PROXY_VM_IP",
"value": PROXY_VM_IP
},
{
"name": "PROXY_VM_PORT",
"value": PROXY_VM_PORT
}]
},
},
],
"enable_web_access": True,
"psc_interface_config": {
"network_attachment": "psc-network-attachment",
"dns_peering_configs": [
{
"domain": "demo.com.",
"target_project": PROJECT_ID,
"target_network": "consumer-vpc"
},
]
},
}
}
print(json.dumps(CUSTOM_JOB, indent=2))
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
import requests
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/customJobs/"
print("request_uri: ", request_uri)
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
response_autopush = requests.post(request_uri, json=CUSTOM_JOB, headers=headers)
response = response_autopush
print("response:", response)
if response.reason == 'OK':
job_name = response.json()['name']
job_id = job_name.split('/')[-1]
print("Created Job: ", response.json()['name'])
else:
print(response.text)
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
# Print KFP SDK version (should be >= 1.6)
! python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
# Print AI Platform version
! python3 -c "from google.cloud import aiplatform; print('AI Platform version: {}'.format(aiplatform.__version__))"
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
!gcloud storage buckets create gs://{BUCKET_URI}
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
# pipeline parameters
CACHE_PIPELINE = False # @param {type: "string"}
_DEFAULT_IMAGE = IMAGE_URI
BUCKET_URI = "gs://{BUCKET_URI}" # @param {type: "string"}
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/intro"
PIPELINE_DISPLAY_NAME = "pipeline_nonRFCIP" # @param {type: "string"}
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
from re import S
import kfp
from kfp import dsl
from kfp.dsl import container_component, ContainerSpec
from kfp import compiler
from google.cloud import aiplatform
# ==== Component with env variable ====
@container_component
def dns_peering_test_op(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
return ContainerSpec(
image=_DEFAULT_IMAGE,
command=["bash", "-c"],
args=[
""&&;"
apt-get update apt-get install inetutils-traceroute inetutils-ping netcat-openbsd curl -y
echo "Local IP(s): $(hostname -I)"
echo "Attempting to trace route to %s"
traceroute -w 1 -m 7 "%s"
echo "Sending curl requests to http://%s via proxy %s:%s and recording trace..."
if curl -L -v --trace-ascii /dev/stdout -x http://%s:%s "http://%s"; then
echo "Curl request succeeded!"
else
echo "Curl request failed!"
exit 1
fi
""" % (dns_domain, dns_domain, dns_domain, proxy_vm_ip, proxy_vm_port, proxy_vm_ip, proxy_vm_port, dns_domain)
]
)
# ==== Pipeline ====
@dsl.pipeline(
name="dns-peering-test-pipeline",
description="Test DNS Peering using env variable",
pipeline_root=PIPELINE_ROOT,
)
def dns_peering_test_pipeline(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
dns_test_task = dns_peering_test_op(dns_domain=dns_domain, proxy_vm_ip=proxy_vm_ip, proxy_vm_port=proxy_vm_port)
dns_test_task.set_caching_options(enable_caching=CACHE_PIPELINE)
# ==== Compile pipeline ====
if __name__ == "__main__":
aiplatform.init(project=PROJECT_ID, location=LOCATION)
compiler.Compiler().compile(
pipeline_func=dns_peering_test_pipeline,
package_path="dns_peering_test_pipeline.yaml",
)
print("✅ Pipeline compiled to dns_peering_test_pipeline.yaml")
В блокноте JupyterLab создайте новую ячейку и выполните следующее.
# Define the PipelineJob body; see API Reference https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.pipelineJobs/create
import requests, json
import datetime
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/pipelineJobs/"
print("request_uri: ", request_uri)
14. Проверка интерфейса PSC
Также вы можете просмотреть IP-адреса сетевого подключения, используемые Vertax AI Pipelines, перейдя по следующей ссылке:
Сетевые службы → Подключение к частной сети → Подключение к сети → psc-network-attachment
Выберите проект арендатора (название проекта заканчивается на -tp).

Выделенное поле обозначает IP-адрес, используемый Vertex AI Pipelines при подключении к сети PSC.

15. Проверка достоверности данных облачного логирования
Первое выполнение задачи в Vertex AI Pipelines займет приблизительно 14 минут, последующие запуски займут гораздо меньше времени. Для подтверждения успешного результата выполните следующие действия:
Перейдите в Vertex AI → Обучение → Пользовательские задания
Выберите выполненное пользовательское задание

Выберите «Просмотреть журналы».

После того, как станет доступна функция Cloud Logging, выберите «Выполнить запрос», который сгенерирует выделенный ниже фрагмент текста, подтверждающий успешную загрузку wget из Vertex AI Pipelines на виртуальную машину класса e.


16. Проверка TCPDump
Давайте рассмотрим вывод TCPDUMP, который дополнительно подтверждает подключение к вычислительным экземплярам:
На виртуальной машине прокси отслеживайте HTTP GET-запрос и код ответа 200 OK.
03:05:34.778574 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778946 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.778974 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781999 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906678 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
В виртуальной машине класса e-vm отслеживается HTTP GET-запрос и ответ 200 OK.
03:05:34.778768 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778819 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.781815 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781856 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906503 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
17. Уборка
В Cloud Shell удалите компоненты учебного пособия.
gcloud compute instances delete proxy-vm --zone=us-central1-a --quiet
gcloud compute instances delete workbench-tutorial --zone=us-central1-a --quiet
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet
gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet
gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet
gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns record-sets delete proxy-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns managed-zones delete private-dns-codelab
gcloud compute networks delete consumer-vpc --quiet
18. Поздравляем!
Поздравляем, вы успешно настроили и проверили интерфейс Private Service Connect с помощью Vertex AI Pipelines.
Вы создали инфраструктуру для потребителя и добавили сетевое подключение, которое позволило производителю создать виртуальную машину с несколькими сетевыми адаптерами для обеспечения связи между потребителем и производителем. Вы научились создавать DNS-пиринг, развернув явный прокси-сервер в сети VPC потребителя, что обеспечило подключение к экземпляру виртуальной машины класса e, которое недоступно для прямой маршрутизации из Vertex.
Cosmopup считает, что обучающие материалы — это здорово!!

Что дальше?
Дополнительная литература и видеоматериалы
Справочная документация
- Обзор сетевого доступа Vertex AI | Google Cloud
- О доступе к сервисам Vertex AI через интерфейсы Private Service Connect | Google Cloud
- Используйте интерфейс Private Service Connect для обучения Vertex AI | Google Cloud
- Настройка интерфейса Private Service Connect для ресурсов Vertex AI | Google Cloud