Vertex AI Pipelines PSC Interface Explicit Proxy

1. Giriş

Private Service Connect arayüzü, üretici Sanal Özel Bulut (VPC) ağının tüketici VPC ağındaki çeşitli hedeflerle bağlantı başlatmasına olanak tanıyan bir kaynaktır. Üretici ve tüketici ağları farklı projelerde ve kuruluşlarda olabilir.

Bir ağ eki, Private Service Connect arayüzünden gelen bağlantıyı kabul ederse Google Cloud, arayüze ağ eki tarafından belirtilen bir tüketici alt ağından IP adresi atar. Tüketici ve üretici ağları bağlıdır ve dahili IP adreslerini kullanarak iletişim kurabilir.

Ağ eki ile Private Service Connect arayüzü arasındaki bağlantı, Private Service Connect uç noktası ile hizmet eki arasındaki bağlantıya benzer ancak iki temel farkı vardır:

  • Ağ eki, üretici ağının tüketici ağına bağlantı başlatmasına (yönetilen hizmet çıkışı) olanak tanırken uç nokta, tüketici ağının üretici ağına bağlantı başlatmasına (yönetilen hizmet girişi) olanak tanır.
  • Private Service Connect arayüz bağlantısı geçişlidir. Bu, bir yapımcı ağının, tüketici ağına bağlı diğer ağlarla iletişim kurabileceği anlamına gelir.

Vertex AI PSC arayüzü erişilebilirliğiyle ilgili dikkat edilmesi gereken noktalar

  • PSC-Interface, trafiği RFC1918 adres bloğundaki VPC veya şirket içi tabanlı hedeflere yönlendirebilir.
  • RFC-1918 olmayan adres bloklarını hedefleyen PSC arayüzü, tüketicinin VPC'sinde RFC-1918 adresiyle açık bir proxy dağıtılmasını gerektirir. Vertex AI dağıtımında proxy, hedef uç noktanın tam alan adı ile birlikte tanımlanmalıdır. Aşağıdaki RFC-1918 dışı CIDR'lere yönlendirmeyi kolaylaştırmak için müşterilerin VPC'lerinde yapılandırılan açık proxy'yi gösteren Şekil 1'e bakın:

[1] 240.0.0.0/4

[2] 203.0.113.0/2

[3]10.10.20.0/28 için proxy gerekmez, rfc1918 aralığına girer.

  • Dağıtımınızı yalnızca bir PSC arayüzüyle yapılandırdığınızda varsayılan internet erişimi korunur. Bu giden trafik, doğrudan güvenli ve Google tarafından yönetilen kiracı ağından çıkar.

476f87a96f153b95.png

Vertex AI PSC-Interface VPC-SC ile ilgili dikkat edilmesi gereken noktalar

  • Projeniz bir VPC Hizmet Kontrolleri çevresinin parçası olduğunda, Google tarafından yönetilen kiracıların varsayılan internet erişimi, veri hırsızlığını önlemek için çevre tarafından engellenir.
  • Bu senaryoda dağıtımın genel internete erişmesine izin vermek için trafiği VPC'niz üzerinden yönlendiren güvenli bir çıkış yolu açıkça yapılandırmanız gerekir. Bunu yapmanın önerilen yolu, VPC sınırınızın içinde RFC1918 adresiyle bir proxy sunucusu oluşturmak ve proxy VM'nin internete erişmesine izin vermek için bir Cloud NAT ağ geçidi oluşturmaktır.

Daha fazla bilgi için aşağıdaki kaynaklara bakın:

Vertex AI kaynakları için Private Service Connect arayüzü oluşturma | Google Cloud

Ne oluşturacaksınız?

Bu eğitimde, üreticiden tüketicinin işlemine bağlantıya izin vermek için Private Service Connect (PSC) arayüzüyle kapsamlı bir Vertex AI Pipelines dağıtımı oluşturacaksınız. Bu dağıtım, Şekil 1'de gösterildiği gibi RFC-1928 olmayan uç noktaları hedefleyecektir.

Şekil 2

782ba8f1f3c3f522.png

Kiracı projesinde Vertex AI Training'i barındıran tüketicilerin sanal makinelerini çözümlemek için DNS eşlemeden yararlanarak tüketici VPC'sinde tek bir psc-network-attachment oluşturursunuz. Bu işlem aşağıdaki kullanım alanlarıyla sonuçlanır:

  1. Vertex AI Pipelines'ı dağıtma ve açık proxy olarak işlev görecek bir proxy sanal makinesi yapılandırma. Bu sayede, E sınıfı alt ağındaki bir sanal makineye karşı wget işlemi gerçekleştirilebilir.

Neler öğreneceksiniz?

  • Ağ eki oluşturma
  • Bir üreticinin PSC arayüzü oluşturmak için ağ eki nasıl kullanabileceği
  • DNS eşleme kullanarak üreticiden tüketiciye iletişimi nasıl kurabilirsiniz?
  • Vertex AI Pipelines'dan RFC1918 olmayan IP adresi alanıyla nasıl iletişim kurulur?

Gerekenler

Google Cloud projesi

IAM İzinleri

2. Başlamadan önce

Projeyi, eğitimi destekleyecek şekilde güncelleme

Bu eğitimde, Cloud Shell'de gcloud yapılandırmasının uygulanmasına yardımcı olmak için $değişkenleri kullanılır.

Cloud Shell'de aşağıdakileri yapın:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

API Etkinleştirme

Cloud Shell'de aşağıdakileri yapın:

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. Tüketici Kurulumu

Tüketici VPC'sini oluşturma

Cloud Shell'de aşağıdakileri yapın:

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

Tüketici alt ağlarını oluşturma

Cloud Shell'de aşağıdakileri yapın:

gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1

Cloud Shell'de aşağıdakileri yapın:

gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1

Private Service Connect ağ eki alt ağını oluşturma

Cloud Shell'de aşağıdakileri yapın:

gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1

Cloud Router ve NAT yapılandırması

Bu eğitimde, genel IP adresi olmayan proxy VM'ye internet erişimi sağlamak için Cloud NAT kullanılır. Cloud NAT, yalnızca özel IP adreslerine sahip sanal makinelerin internete bağlanmasını sağlayarak yazılım paketleri yükleme gibi görevleri gerçekleştirmelerine olanak tanır.

Cloud Shell'de bulut yönlendiricisini oluşturun.

gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1

Cloud Shell'de NAT ağ geçidini oluşturun.

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'yi etkinleştirme

IAP'nin sanal makine örneklerinize bağlanmasına izin vermek için aşağıdaki özellikleri içeren bir güvenlik duvarı kuralı oluşturun:

  • IAP kullanarak erişmek istediğiniz tüm sanal makine örnekleri için geçerlidir.
  • 35.235.240.0/20 IP aralığından gelen giriş trafiğine izin verir. Bu aralık, IAP'nin TCP yönlendirme için kullandığı tüm IP adreslerini içerir.

Cloud Shell'de IAP güvenlik duvarı kuralını oluşturun.

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

5. Tüketici sanal makine örnekleri oluşturma

Cloud Shell'de consumer vm örneği olan class-e-vm'yi oluşturun.

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'de, Vertex AI Pipelines için açık proxy görevi görecek olan tüketici sanal makine örneği proxy-vm'yi oluşturun. HTTPS de desteklenmesine rağmen HTTP trafiğini proxy'lemek için tinyproxy uygulamasını kullanacağız.

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 ağ eki

Ağ ekleri, Private Service Connect arayüzünün tüketici tarafını temsil eden bölgesel kaynaklardır. Bir ağ ekiyle tek bir alt ağ ilişkilendirirsiniz ve üretici, Private Service Connect arayüzüne bu alt ağdan IP'ler atar. Alt ağ, ağ ekiyle aynı bölgede olmalıdır. Ağ eki, üretici hizmetiyle aynı bölgede olmalıdır.

Ağ eki oluşturma

Cloud Shell'de ağ ekini oluşturun.

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_AUTOMATIC \
    --subnets=intf-subnet

Ağ eklerini listeleme

Cloud Shell'de ağ ekini listeleyin.

gcloud compute network-attachments list

Ağ eklerini açıklama

Cloud Shell'de ağ ekini açıklayın.

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

Üretici, Private Service Connect arayüzünü oluştururken kullanılacak psc-network-attachment adını (psc-network-attachment) not edin.

PSC Network Attachment URL'sini Cloud Console'da görüntülemek için şuraya gidin:

Ağ Hizmetleri → Private Service Connect → Ağ Eki → psc-network-attachment

e191e54a103d2222.png

7. Özel DNS bölgesi

demo.com için bir Cloud DNS bölgesi oluşturacak ve bu bölgeyi sanal makinelerinizin IP adreslerini işaret eden A kayıtlarıyla dolduracaksınız. Daha sonra, Vertex AI Pipelines işinde DNS eşleme dağıtılacak. Bu sayede, tüketicinin DNS kayıtlarına erişilebilecek.

Cloud Shell'de aşağıdakileri yapın:

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'de, ilgili IP adreslerini almak için sanal makine örneklerine karşı bir açıklama işlemi gerçekleştirin.

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'de sanal makine için kayıt kümesini (class-e-vm) oluşturun ve IP adresini ortamınızın çıkışına göre güncellediğinizden emin olun.

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'de sanal makine ve proxy-vm için kayıt kümesini oluşturun. Ortamınızın çıkışına göre IP adresini güncellediğinizden emin olun.

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 arayüzünden erişime izin verecek bir Cloud Firewall kuralı oluşturun

Aşağıdaki bölümde, PSC Ağ Eklentisi'nden kaynaklanan trafiğin tüketicilerin VPC'sindeki RFC1918 işlem kaynaklarına erişmesine izin veren bir güvenlik duvarı kuralı oluşturun.

Cloud Shell'de, PSC Network Attachment alt ağından proxy-vm'ye erişime izin veren giriş güvenlik duvarı kuralını oluşturun.

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'de, proxy-vm alt ağından class-e alt ağına erişime izin veren giriş güvenlik duvarı kuralını oluşturun.

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. Açık proxy'yi güncelleme

Aşağıdaki bölümde, açık proxy'ye SSH ile bağlanmanız ve tinyproxy.conf yapılandırma dosyasını güncelleyip sıfırlama işlemini gerçekleştirmeniz gerekir.

Cloud Shell'den

gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid

tinyproxy yapılandırma dosyasını açın ve tercih ettiğiniz düzenleyiciyi kullanarak güncelleyin. Aşağıda VIM'in kullanıldığı bir örnek verilmiştir.

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 Notebook oluşturma

Aşağıdaki bölümde, Jupyter Notebook oluşturma konusunda size yol gösterilir. Bu not defteri, Vertex AI Pipelines'dan test örneklerine wget gönderen bir Vertex AI Pipelines işini dağıtmak için kullanılacaktır. Vertex AI Pipelines ile örnekleri içeren tüketici ağı arasındaki veri yolu, Private Service Connect ağ arayüzünü kullanır.

Kullanıcı tarafından yönetilen hizmet hesabı oluşturma

Aşağıdaki bölümde, eğitimde kullanılan Vertex AI Workbench örneğiyle ilişkilendirilecek bir hizmet hesabı oluşturacaksınız.

Eğitimde, hizmet hesabına aşağıdaki roller uygulanır:

Cloud Shell'de hizmet hesabını oluşturun.

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

Cloud Shell'de hizmet hesabını Storage Admin rolüyle güncelleyin.

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

Cloud Shell'de hizmet hesabını Vertex AI Kullanıcısı rolüyle güncelleyin.

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

Cloud Shell'de hizmet hesabını Artifact Registry Yöneticisi rolüyle güncelleyin.

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

Cloud Shell'de hizmet hesabını Cloud Build Düzenleyici rolüyle güncelleyin.

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

Cloud Shell'de, not defteri hizmet hesabının Compute Engine varsayılan hizmet hesabını kullanmasına izin verin.

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 örneği oluşturma

Aşağıdaki bölümde, daha önce oluşturulan hizmet hesabını (notebook-sa) içeren bir Vertex AI Workbench örneği oluşturun.

Cloud Shell'de private-client örneğini oluşturun.

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 Service Agent Update

Vertex AI, PSC arayüzünü oluşturmak için kullanılan PSC Ağ Eki alt ağından IP adresi alma gibi işlemleri sizin adınıza gerçekleştirir. Vertex AI, bu işlemi gerçekleştirmek için Ağ Yöneticisi izni gerektiren bir hizmet aracısı (aşağıda listelenmiştir) kullanır.

service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com

Cloud Shell'de proje numaranızı alın.

gcloud projects describe $projectid | grep projectNumber

Cloud Shell'de proje numaranızı alın.

gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'

Cloud Shell'de proje numaranızı ayarlayın.

projectnumber=YOUR-PROJECT-Number

Cloud Shell'de AI Platform için bir hizmet hesabı oluşturun. Projenizde mevcut bir hizmet hesabınız varsa bu adımı atlayın.

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

Cloud Shell'de, hizmet aracısı hesabını compute.networkAdmin rolüyle güncelleyin.

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

Cloud Shell'de hizmet aracısı hesabını dns.peer rolüyle güncelleyin.

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

Varsayılan Hizmet Hesabı Güncellemesi

Compute Engine API'yi etkinleştirin ve varsayılan hizmet hesabınıza Vertex AI'ye erişim izni verin. Erişim değişikliğinin geçerlilik kazanması biraz zaman alabilir.

Cloud Shell'de varsayılan hizmet hesabını aiplatform.user rolüyle güncelleyin.

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

Cloud Shell'de varsayılan hizmet hesabını storage.admin rolüyle güncelleyin.

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

Cloud Shell'de varsayılan hizmet hesabını storage.admin rolüyle güncelleyin.

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

12. Tcpdump'ı etkinleştirme

Vertex AI Pipelines'dan IP bağlantısını doğrulamak için TCPDUMP'ı kullanabiliriz. Bu sayede, Vertex AI Pipelines'dan vm'ye (class-e-vm.demo.com) istek gönderirken PSC Network Attachment alt ağından (192.168.10.0/28) gelen iletişimi gözlemleyebiliriz.

Cloud Shell'den proxy sanal makinesine SSH üzerinden bağlanın.

gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid

proxy-vm işletim sisteminden class-e-vm ve PSC ağ eki alt ağında tcpdump filtreleme işlemini yürütün.

sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn

Yeni bir Cloud Shell sekmesi açın, proje değişkeninizi güncelleyin ve class-e-vm'ye SSH ile bağlanın.

gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid

class-e-vm işletim sisteminden proxy-vm alt ağında tcpdump filtreleme işlemini yürütün.

sudo tcpdump -i any net 10.10.10.0/28 -nn

13. Vertex AI Pipelines işini dağıtma

Aşağıdaki bölümde, Vertex AI Pipelines'dan açık proxy'ye başarılı bir wget işlemi gerçekleştirmek için not defteri oluşturacaksınız. Bu sayede, class-e-vm gibi RFC 1918 olmayan sanal makinelere ulaşabilirsiniz. Hedefi bir RFC 1918 IP adresi olduğundan Vertex AI Pipelines'ın rfc1918-vm'ye erişmesi için açık proxy gerekmez.

Eğitim işini Vertex AI Workbench örneğinde çalıştırma

  1. Google Cloud Console'da Vertex AI Workbench sayfasındaki örnekler sekmesine gidin.
  2. Vertex AI Workbench örneğinizin (workbench-tutorial) adının yanındaki Open JupyterLab'i (JupyterLab'i aç) tıklayın. Vertex AI Workbench örneğiniz JupyterLab'de açılır.
  3. Dosya > Yeni > Not defteri'ni seçin.
  4. Çekirdek > Python 3'ü seçin.

JupyterLab not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

# 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 not defterinizde yeni bir hücre oluşturun, aşağıdakileri güncelleyin ve çalıştırın. PROJECT_ID'yi ortamınızın ayrıntılarıyla güncellediğinizden emin olun.

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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

# 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 not defterinizde yeni bir hücre oluşturun ve aşağıdaki yapılandırmayı çalıştırın. Aşağıdaki önemli noktaları unutmayın:

  • proxy_server = "http://proxy-vm.demo.com:8888" FQDN, tüketici VPC'sinde dağıtılan proxy VM ile ilişkilidir. FQDN'yi sonraki bir adımda çözmek için DNS eşlemesini kullanıyoruz.
%%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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

%%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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1

JupyterLab not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

!gcloud auth configure-docker us-docker.pkg.dev --quiet

JupyterLab not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın. Varsa hatayı (gcloud.builds.submit) dikkate almayın.

!gcloud builds submit --tag {IMAGE_URI} --region=us-central1

JupyterLab not defterinizde aşağıdaki hücreyi oluşturup çalıştırın. Aşağıdaki önemli noktaları unutmayın:

  • Tüketici VPC'leri ile DNS eşlemesi, demo.com alan adı için dnsPeeringConfigs (dnsPeeringConfigs) kullanılarak yapılandırılır.
  • PROXY_VM_IP değişkeni olarak tanımlanan açık proxy, proxy-vm.demo.com'dur. Çözümleme, tüketicinin VPC'sindeki DNS eşlemesi aracılığıyla yapılır.
  • 8888 numaralı bağlantı noktası, tinyproxy'de yapılandırılan dinleme bağlantı noktasıdır (varsayılan).
  • class-e-vm-demo.com için wget, DNS eşleme üzerinden çözümlenir.
  • Kod, Vertex için "psc-network-attachment"ı belirtir. Bu sayede, iki PSC arayüzü örneği dağıtmak için ağ eki alt ağını kullanabilir.
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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

# 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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name

JupyterLab not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

!gcloud storage buckets create gs://{BUCKET_URI}

JupyterLab not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

# 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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

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 not defterinizde yeni bir hücre oluşturun ve aşağıdakileri çalıştırın.

# 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 Arayüzü Doğrulaması

Ayrıca, aşağıdaki konuma giderek Vertex AI Pipelines tarafından kullanılan ağ ekleme IP'lerini de görüntüleyebilirsiniz:

Ağ Hizmetleri → Private Service Connect → Ağ Eki → psc-network-attachment

Kiracı projesini seçin (proje adı -tp ile biter).

f47150235fedb8ce.png

Vurgulanan alan, Vertex AI Pipelines'ın PSC ağ ekinden kullandığı IP adresini gösterir.

39e7b251aeb4f191.png

15. Cloud Logging Validation

Vertex AI Pipelines işinin ilk kez çalıştırılması yaklaşık 14 dakika sürer. Sonraki çalıştırmalar çok daha kısa sürer. Başarılı bir sonucu doğrulamak için aşağıdakileri yapın:

Vertex AI → Eğitim → Özel işler'e gidin.

Yürütülen özel işi seçin.

a9be0395c842aa6f.png

Günlükleri Görüntüle'yi seçin.

53e30765ba5827f3.png

Cloud Logging kullanıma sunulduktan sonra, Vertex AI Pipelines'dan class-e-vm'ye başarılı bir wget işlemini onaylayan aşağıdaki vurgulanmış seçimi oluşturan sorguyu çalıştırın.

f2c5d9fdf5cc8bed.png

3b3788603bb433ee.png

16. TCPDump Doğrulaması

TCPDUMP çıkışını inceleyerek işlem örneklerine bağlantının daha da doğrulandığını görelim:

proxy-vm'den HTTP GET ve 200 OK'u gözlemleyin.

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

class-e-vm'den HTTP GET ve 200 OK'u gözlemleyin.

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. Temizleme

Cloud Shell'den eğitim bileşenlerini silin.

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. Tebrikler

Tebrikler! Vertex AI Pipelines ile Private Service Connect arayüzünü başarıyla yapılandırdınız ve doğruladınız.

Tüketici altyapısını oluşturdunuz ve üreticinin tüketici ile üretici arasındaki iletişimi köprülemek için çoklu NIC VM oluşturmasına olanak tanıyan bir ağ eki eklediniz. Tüketici VPC ağında, doğrudan Vertex'ten yönlendirilemeyen class-e-vm örneğine bağlantı sağlayan açık bir proxy dağıtırken DNS eşlemesi oluşturmayı öğrendiniz.

Cosmopup, eğitimlerin harika olduğunu düşünüyor.

c911c127bffdee57.jpeg

Yapabilecekleriniz

Daha fazla bilgi ve videolar

Referans belgeleri