Конвейеры искусственного интеллекта Vertex, интерфейс PSC, SWP

1. Введение

Интерфейс Private Service Connect — это ресурс, позволяющий сети виртуальной частной сети (VPC) производителя инициировать соединения с различными пунктами назначения в сети VPC потребителя. Сети производителя и потребителя могут находиться в разных проектах и ​​организациях.

Если сетевое соединение принимает подключение от интерфейса Private Service Connect, Google Cloud выделяет этому интерфейсу IP-адрес из подсети потребителя, указанной в сетевом соединении. Сети потребителя и производителя соединяются и могут обмениваться данными, используя внутренние IP-адреса.

Соединение между сетевым устройством и интерфейсом Private Service Connect аналогично соединению между конечной точкой Private Service Connect и сервисным устройством, но имеет два ключевых отличия:

  • Сетевое подключение позволяет сети-производителю инициировать соединения с сетью-потребителем (исходящий трафик управляемых сервисов), а конечная точка позволяет сети-потребителю инициировать соединения с сетью-производителем (входящий трафик управляемых сервисов).
  • Соединение через интерфейс Private Service Connect является транзитивным. Это означает, что сеть-производитель может взаимодействовать с другими сетями, подключенными к сети потребителя.

d7dc28d6567e6283.png Рисунок 1

Вопросы доступности интерфейса PSC в Vertex AI

  • Интерфейс Vertex AI PSC-Interface способен маршрутизировать трафик к адресатам в VPC или локально в пределах адресного блока RFC1918.
  • Для работы PSC-интерфейса с адресами, не входящими в RFC-1918, требуется явное развертывание прокси-сервера в VPC потребителя с адресом RFC-1918. В развертывании Vertex AI прокси-сервер должен быть определен вместе с полным доменным именем (FQDN) целевой конечной точки. См. рисунок 1, на котором представлен явный режим прокси-сервера Secure Web proxy (SWP), настроенный в VPC потребителя для обеспечения маршрутизации к следующим CIDR, не входящим в RFC-1918:
  1. 240.0.0.0/4
  2. 203.0.113.0/24
  3. 10.10.20.0/28, прокси не требуется, относится к диапазону RFC-1918.
  4. Выход из интернета

Подключение к интернету для сети Google Managed Tenant Network:

Интерфейс Vertex AI PSC без VPC-SC

  • При настройке развертывания только с использованием интерфейса PSC сохраняется доступ к интернету по умолчанию. Исходящий трафик поступает непосредственно из сети арендатора, управляемой Google.

Интерфейс Vertex AI PSC с VPC-SC

  • Когда ваш проект является частью периметра VPC Service Controls, доступ к интернету по умолчанию для арендатора, управляемого Google, блокируется периметром, чтобы предотвратить утечку данных.
  • Чтобы обеспечить доступ развертывания к общедоступному интернету в этом сценарии, необходимо явно настроить защищенный исходящий путь, который направляет трафик через вашу VPC, подключенную к Vertex AI. Один из способов достижения этой цели — развертывание прокси-сервера внутри сети VPC с адресом RFC 1918 в паре с шлюзом Cloud NAT. Обратите внимание, что вы также можете использовать защищенный веб-прокси для переадресации трафика в интернет. Создание защищенного веб-прокси автоматически создает шлюз Cloud NAT.

Для получения дополнительной информации обратитесь к следующим ресурсам:

Настройка интерфейса Private Service Connect для ресурсов Vertex AI | Google Cloud

Что вы построите

В этом руководстве вы создадите комплексную систему развертывания Vertex AI Pipelines с использованием интерфейса Private Service Connect (PSC), обеспечивающего связь между производителем и вычислительными ресурсами потребителя, как показано на рисунке 1, с целевым назначением на конечную точку, не соответствующую RFC 1918, в class-e-subnet .

2d095dc2f4de6b4b.png Рисунок 2

Вам потребуется создать единое сетевое psc-network-attachment в потребительской VPC, используя DNS-пиринг для разрешения имен виртуальных машин потребителей в проекте арендатора, на котором размещено обучение Vertex AI, что приведет к следующим сценариям использования:

Разверните Vertex AI Pipelines и настройте Secure Web Proxy в режиме явного прокси, разрешив ему выполнять wget на виртуальной машине в подсети класса E.

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

  • Как создать сетевое подключение
  • Как производитель может использовать сетевое подключение для создания интерфейса PSC
  • Как настроить DNS-пиринг для разрешения частных доменов, настроенных в потребительской сети VPC, из управляемых сетей VPC Google.
  • Как перенаправить трафик из интерфейса Vertex AI PSC на защищенный веб-прокси
  • Как установить связь с адресным пространством IP, не соответствующим RFC-1918, из Vertex AI Pipelines

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

Проект Google Cloud

Разрешения IAM

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

Обновите проект, чтобы он соответствовал учебному пособию.

В этом руководстве переменные `$variables` используются для упрощения настройки gcloud в Cloud Shell.

Внутри Cloud Shell выполните следующие действия:

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
projectid=YOUR-PROJECT-ID
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"
gcloud services enable "networkservices.googleapis.com"
gcloud services enable "networksecurity.googleapis.com"
gcloud services enable "certificatemanager.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 --enable-private-ip-google-access

Создайте подсеть только для прокси-сервера.

gcloud compute networks subnets create proxy-only-uscentral1 \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=us-central1 \
    --network=consumer-vpc \
    --range=10.10.100.0/26

Создайте подсеть подключения к частной сети (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 \
--enable-private-ip-google-access

Настройка облачного маршрутизатора и NAT.

Google Cloud Secure Web Proxy автоматически создает и управляет шлюзом Cloud NAT и связанным с ним маршрутизатором Cloud Router в регионе, где он развернут.

4. Включите IAP.

Чтобы разрешить IAP (Identity Aware Proxy) подключаться к вашим виртуальным машинам, создайте правило брандмауэра, которое:

  • Применяется ко всем экземплярам виртуальных машин, к которым вы хотите обеспечить доступ с помощью 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 создайте экземпляр виртуальной машины потребителя, class-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 \ 
    --private-network-ip=240.0.0.2

6. Безопасный веб-прокси

Явный режим Secure Web Proxy (или режим явной маршрутизации прокси) — это метод развертывания, при котором клиентские рабочие нагрузки должны быть явно настроены на использование внутреннего IP-адреса или полного доменного имени и порта SWP в качестве прокси-сервера переадресации.

В следующих шагах обязательно измените YOUR-PROJECT-ID на идентификатор вашего проекта.

Создайте веб-прокси:

В Cloud Shell создайте файл policy.yaml с помощью текстового редактора:

cat > policy.yaml << EOF
description: basic Secure Web Proxy policy
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
EOF

В Cloud Shell сгенерируйте политику безопасного веб-прокси:

gcloud network-security gateway-security-policies import policy1 \
    --source=policy.yaml \
    --location=us-central1

В следующем разделе создайте правило, разрешающее доступ к class-e-vm на основе параметра sessionMatcher хоста.

В Cloud Shell создайте файл rule1.yaml с помощью текстового редактора:

cat > rule1.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-nonrfc-classe
description: Allow nonrfc class-e
enabled: true
priority: 1
basicProfile: ALLOW
sessionMatcher: host() == 'class-e-vm.demo.com'
EOF

В следующем разделе создайте правило, разрешающее доступ Jupyter Notebook к установке Apache2 на виртуальной машине "class-e" .

В Cloud Shell создайте файл rule2.yaml с помощью текстового редактора:

cat > rule2.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-apache2
description: Allow Apache2 install on class-e VM
enabled: true
priority: 2
basicProfile: ALLOW
sessionMatcher: inIpRange(source.ip,'240.0.0.2')
EOF

В Cloud Shell сгенерируйте правило политики безопасности rule1:

gcloud network-security gateway-security-policies rules import allow-nonrfc-classe \
    --source=rule1.yaml \
    --location=us-central1 \
    --gateway-security-policy=policy1

В Cloud Shell сгенерируйте правило политики безопасности rule2:

gcloud network-security gateway-security-policies rules import allow-apache2 \
    --source=rule2.yaml \
    --location=us-central1 \
    --gateway-security-policy=policy1

Для поддержки обучения с помощью Vertex AI настройте шлюз Secure Web Proxy, используя следующие параметры:

  • Порт прослушивания: Используйте тот же порт, который указан в настройках явного прокси-сервера приложения Vertex AI (например, 8080).
  • Адрес: Назначить частный IP-адрес из диапазона RFC 1918.
  • Режим маршрутизации: установите значение EXPLICIT_ROUTING_MODE.

В Cloud Shell создайте файл gateway.yaml для определения шлюза безопасного веб-прокси:

cat > gateway.yaml << EOF
name: projects/$projectid/locations/us-central1/gateways/swp1
type: SECURE_WEB_GATEWAY
addresses: ["10.10.10.5"]
ports: [8080]
gatewaySecurityPolicy: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
network: projects/$projectid/global/networks/consumer-vpc
subnetwork: projects/$projectid/regions/us-central1/subnetworks/rfc1918-subnet1
routingMode: EXPLICIT_ROUTING_MODE
EOF

В Cloud Shell создайте экземпляр защищенного веб-прокси:

gcloud network-services gateways import swp1 \
    --source=gateway.yaml \
    --location=us-central1

Развертывание защищенного веб-прокси может занять несколько минут.

e8a4cf23bfc63030.png

7. Подключение к сети 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_MANUAL \
    --subnets=intf-subnet

Примечание: Вам не нужно явно указывать идентификатор принятого проекта в этом приложении, поскольку при настройке Vertex AI проект в управляемом арендаторе Google будет добавлен автоматически, как если бы для него была настроена опция «Принимать автоматически».

Перечислите сетевые подключения.

Внутри Cloud Shell отобразите список сетевых подключений.

gcloud compute network-attachments list

Опишите сетевые подключения.

Внутри Cloud Shell опишите сетевое подключение.

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

Запишите имя сетевого подключения PSC, psc-network-attachment , которое будет использоваться производителем при создании интерфейса подключения к частной службе (Private Service Connect Interface).

Чтобы просмотреть URL-адрес сетевого подключения PSC в консоли Cloud Console, перейдите по следующей ссылке:

Сетевые службы → Подключение к частной сети → Подключение к сети → psc-network-attachment

b969cca5242d9c8a.png

8. Частная 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 создайте набор записей для виртуальной машины class-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 создайте набор записей для защищенного веб-прокси, обязательно обновите IP-адрес в соответствии с выводом вашей среды.

gcloud dns --project=$projectid record-sets create explicit-swp.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.5"

Создайте правило облачного брандмауэра, разрешающее доступ через интерфейс PSC.

В следующем разделе создайте правило брандмауэра, разрешающее трафику, исходящему от сетевого подключения PSC, доступ к вычислительным ресурсам RFC 1918 в VPC потребителей.

В Cloud Shell создайте правило входящего трафика брандмауэра, разрешающее доступ из подсети, доступной только через прокси, в подсеть класса e. При этом SWP инициирует соединение с подсетью, доступной только через прокси, в качестве исходного адреса.

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.100.0/28" \
    --destination-ranges="240.0.0.0/4" \
    --enable-logging

9. Создайте блокнот Jupyter.

В следующем разделе описано, как создать блокнот Jupyter. Этот блокнот будет использоваться для развертывания задания Vertex AI Pipelines, которое отправляет wget из Vertex AI Pipelines на тестовые экземпляры. Путь передачи данных между Vertex AI Pipelines и потребительской сетью, содержащей экземпляры, использует интерфейс Private Service Connect.

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

В следующем разделе вы создадите учетную запись службы, которая будет связана с экземпляром Vertex AI Workbench, используемым в этом руководстве.

В данном руководстве к учетной записи службы будут применены следующие роли:

Войдите в Cloud Shell и выполните следующие действия:

Создайте учетную запись службы.

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

Обновите учетную запись службы, добавив ей роль «Администратор хранилища».

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"

Обновите учетную запись службы, добавив роль «Пользователь платформы ИИ».

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"

Обновите учетную запись службы, добавив ей роль «Администратор реестра артефактов».

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"

Обновите учетную запись службы, добавив роль «Редактор облачной сборки».

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"

Разрешите учетной записи службы ноутбука использовать учетную запись службы 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

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

Внутри Cloud Shell:

Получите номер своего проекта.

gcloud projects describe $projectid | grep projectNumber

Укажите номер вашего проекта.

projectnumber=YOUR-PROJECT-NUMBER

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

gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber

Обновите учетную запись агента службы, добавив роль compute.networkAdmin .

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"

Обновите учетную запись агента службы, добавив роль 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"

Обновите учетную запись службы по умолчанию, добавив ей роль storage.admin

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
    --role="roles/storage.admin"

Обновите учетную запись службы по умолчанию, добавив ей роль artifactregistry.admin

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
    --role="roles/artifactregistry.admin"

12. Установите Apache2 и включите Tcpdump на виртуальной машине класса e:

Установите Apache2 на class-e-vm через защищенный веб-прокси:

Откройте новую вкладку Cloud Shell, обновите переменную проекта и подключитесь к виртуальной машине класса e по SSH.

gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" update
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" install apache2 -y
sudo service apache2 restart
echo 'class-e Server !!' | sudo tee /var/www/html/index.html

Выполните фильтрацию tcpdump в подсети, предназначенной только для прокси-сервера, которая используется защищенным веб-прокси для пересылки трафика целевым устройствам.

С операционной системы виртуальной машины класса e выполните фильтрацию tcpdump в подсети прокси-виртуальной машины.

sudo tcpdump -i any net 10.10.100.0/24 -nn

Примечание: Убедитесь, что для открытия сессии JupyterLab включен частный доступ Google в подсети экземпляра workbench-tutorial.

13. Развертывание конвейеров искусственного интеллекта Vertex.

В следующем разделе вы создадите ноутбук для успешного выполнения wget из Vertex AI Pipelines к явному прокси-серверу. Это позволит вам получить доступ к виртуальным машинам, не соответствующим RFC 1918, таким как class-e-vm . Явный прокси-сервер не требуется для доступа Vertex AI Pipelines к rfc1918-vm , поскольку его целью является IP-адрес, соответствующий RFC 1918.

Запустите задачу обучения в экземпляре Vertex AI Workbench.

  1. В консоли Google Cloud перейдите на вкладку «Экземпляры» на странице Vertex AI Workbench.
  2. Рядом с именем вашего экземпляра Vertex AI Workbench (workbench-tutorial) нажмите «Открыть JupyterLab». Ваш экземпляр Vertex AI Workbench откроется в JupyterLab.
  3. Выберите Файл > Создать > Блокнот
  4. Выберите Ядро > Python 3

В блокноте 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://explicit-swp.demo.com:8080"
  • Полное доменное имя (FQDN) связано с виртуальной машиной-прокси, развернутой в потребительской VPC. На более позднем этапе мы используем DNS-пиринг для разрешения FQDN.
%%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 nonRFC-1918 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://explicit-swp.demo.com:8080" # replace it with your Secure Web proxy Ip-address and the 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.
  • В данном случае в качестве веб-прокси используется явный режим маршрутизации explicit-swp.demo.com. Разрешение имен осуществляется посредством DNS-пиринга внутри VPC потребителя.
  • Порт 8080 — это порт прослушивания (по умолчанию), настроенный в Secure Web Proxy.
  • wget к class-e-vm-demo.com через DNS-пиринг осуществляется с помощью команды wget.
  • В коде указан параметр "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 = "explicit-swp.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8080" #@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).

a2e0b6d6243f26f1.png

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

11e411ea919d3bad.png

15. Проверка достоверности данных облачного логирования

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

Перейдите в Vertex AI → Обучение → Пользовательские задания

Выберите выполненное пользовательское задание

2f467254aa0c2e3a.png

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

8d525d3b152bcc61.png

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

a4f9e9167f4ce1ae.png

38972f834aa2bd1d.png

16. Проверка TCPDump

Давайте рассмотрим вывод TCPDUMP, который дополнительно подтверждает подключение к вычислительным экземплярам:

В виртуальной машине class-e-vm отслеживается HTTP GET-запрос и ответ 200 OK.

XXXXXXXXX@class-e-vm:~$ sudo tcpdump -i any net 10.10.100.0/28 -nn
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
05:51:14.173641 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [S], seq 1747181041, win 65535, options [mss 1420,sackOK,TS val 3942828403 ecr 0,nop,wscale 8], length 0
05:51:14.173668 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [S.], seq 3013226100, ack 1747181042, win 64768, options [mss 1420,sackOK,TS val 1886125065 ecr 3942828403,nop,wscale 7], length 0
05:51:14.174977 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [.], ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 0
05:51:14.175066 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [P.], seq 1:223, ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 222: HTTP: GET / HTTP/1.1
05:51:14.175096 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [.], ack 223, win 505, options [nop,nop,TS val 1886125066 ecr 3942828405], length 0
05:51:14.239042 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [P.], seq 1:246, ack 223, win 505, options [nop,nop,TS val 1886125130 ecr 3942828405], length 245: HTTP: HTTP/1.1 200 OK

17. Уборка

В Cloud Shell удалите компоненты учебного пособия.

gcloud workbench instances delete workbench-tutorial --project=$projectid --location=us-central1-a

gcloud network-security gateway-security-policies rules delete allow-nonrfc-classe \
    --gateway-security-policy=policy1 \
    --location=us-central1

gcloud network-security gateway-security-policies rules delete allow-apache2 \
    --gateway-security-policy=policy1 \
    --location=us-central1

gcloud network-security gateway-security-policies delete policy1 \
    --location=us-central1
gcloud network-services gateways delete swp1 \
    --location=us-central1

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 explicit-swp.demo.com --zone=private-dns-codelab  --type=A

gcloud dns managed-zones delete private-dns-codelab

gcloud computeinstances delete class-e-vm --project=$projectid --zone=us-central1-a --quiet
gcloud compute networks delete consumer-vpc --quiet

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

Поздравляем, вы успешно настроили и подтвердили соединение между частным сервисом Vertex AI Pipelines Private Service Connect Interface и диапазонами IP-адресов, не поддерживающими RFC, через защищенный веб-прокси.

Вы создали инфраструктуру для потребителей и добавили сетевое подключение, которое позволило производителю создать виртуальную машину с несколькими сетевыми адаптерами для обеспечения связи между потребителями и производителем. Вы научились создавать DNS-пиринг, развернув явный прокси-сервер в сети VPC потребителя, что обеспечило подключение к экземпляру class-e-vm которое недоступно для прямой маршрутизации из Vertex.

678ba30d64a76795.png

Что дальше?

Дополнительная литература и видеоматериалы

Справочная документация