Vertex AI Pipelines PSC Interface SWP

1. Giriş

Private Service Connect arayüzü, üretici Sanal Özel Bulut (VPC) ağının tüketici VPC ağındaki çeşitli hedeflere 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.

d7dc28d6567e6283.pngŞekil:1

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

  • Vertex AI PSC arayüzü, trafiği RFC1918 adres bloğundaki bir VPC veya şirket içi 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, hedef uç noktanın FQDN'si ile birlikte proxy tanımlanmalıdır. Aşağıdaki RFC-1918 dışı CIDR'lere yönlendirmeyi kolaylaştırmak için tüketici VPC'sinde yapılandırılmış açık proxy modu Secure Web Proxy'yi (SWP) temsil eden Şekil 1'e bakın:
  1. 240.0.0.0/4
  2. 203.0.113.0/24
  3. 10.10.20.0/28 için proxy gerekmez, RFC-1918 aralığına girer.
  4. İnternet Çıkışı

Google tarafından yönetilen kiracı ağı için internet bağlantısı:

VPC-SC olmadan Vertex AI PSC arayüzü

  • 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 Google tarafından yönetilen kiracı ağından çıkar.

VPC-SC ile Vertex AI PSC arayüzü

  • Projeniz bir VPC Hizmet Kontrolleri çevresinin parçası olduğunda, Google tarafından yönetilen kiracını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 Vertex AI'a bağlı VPC'niz üzerinden yönlendiren güvenli bir çıkış yolu açıkça yapılandırmanız gerekir. Bunu yapmanın bir yolu, RFC 1918 adresine sahip VPC ağına bir Cloud NAT ağ geçidiyle eşleştirilmiş proxy sunucusu dağıtmaktır. Trafiği internete yönlendirmek için güvenli web proxy'sini de kullanabileceğinizi unutmayın. Güvenli Web Proxy oluşturma işlemi, otomatik olarak bir Cloud NAT ağ geçidi oluşturur.

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, class-e-subnet içinde RFC 1918 olmayan bir uç noktayı hedefleyerek Şekil 1'de gösterildiği gibi üreticiden tüketicinin işlemine bağlantıya izin vermek için Private Service Connect (PSC) arayüzü ile kapsamlı bir Vertex AI Pipelines dağıtımı oluşturacaksınız.

2d095dc2f4de6b4b.pngŞekil 2

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

Vertex AI Pipelines'ı dağıtın ve güvenli web proxy'sini açık proxy modunda yapılandırarak E sınıfı alt ağındaki bir sanal makineye karşı wget işlemi gerçekleştirmesine izin verin.

Neler öğreneceksiniz?

  • Ağ eki oluşturma
  • Üreticinin PSC arayüzü oluşturmak için ağ eki nasıl kullanabileceği
  • Google tarafından yönetilen VPC ağlarından, tüketici VPC ağında yapılandırılan özel alanları çözümlemek için DNS eşlemesi oluşturma
  • Trafiği Vertex AI PSC arayüzünden Secure Web Proxy'ye yönlendirme
  • Vertex AI Pipelines'dan RFC-1918 olmayan IP adresi alanıyla iletişim kurma

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

Yalnızca proxy alt ağı oluşturma

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 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 \
--enable-private-ip-google-access

Cloud Router ve NAT yapılandırması

Google Cloud Secure Web Proxy, dağıtıldığı bölgede bir Cloud NAT ağ geçidini ve ilişkili bir Cloud Router'ı otomatik olarak sağlar ve yönetir.

4. IAP'yi etkinleştirme

IAP'nin (Identity Aware Proxy) 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 tüketici sanal makine örneğini (class-e-vm) 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 \ 
    --private-network-ip=240.0.0.2

6. Secure Web Proxy

Güvenli Web Proxy'nin Açık Modu (veya Açık Proxy Yönlendirme Modu), istemci iş yüklerinin yönlendirme proxy'si olarak SWP'nin dahili IP adresini veya tam etki alanı adını ve bağlantı noktasını kullanacak şekilde açıkça yapılandırılması gereken bir dağıtım yöntemidir.

Aşağıdaki adımlarda YOUR-PROJECT-ID değerini proje kimliğinizle değiştirdiğinizden emin olun.

Web proxy'si oluşturma:

Cloud Shell'de bir metin düzenleyici kullanarak policy.yaml dosyasını oluşturun:

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

Cloud Shell'de Secure Web Proxy politikasını oluşturun:

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

Aşağıdaki bölümde, class-e-vm'a sessionMatcher'ya göre erişime izin verecek bir kural oluşturun.

Cloud Shell'de bir metin düzenleyici kullanarak rule1.yaml dosyasını oluşturun:

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

Aşağıdaki bölümde, "class-e" VM'sine apache2 yüklenmesine izin vermek için Jupyter not defteri erişimine izin veren bir kural oluşturun.

Cloud Shell'de bir metin düzenleyici kullanarak rule2.yaml dosyasını oluşturun:

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'de security policy rule1'i oluşturun:

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

Cloud Shell'de security policy rule2'yi oluşturun:

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

Vertex AI Training'i desteklemek için Secure Web Proxy ağ geçidini şu ayarlarla yapılandırın:

  • Dinleme bağlantı noktası: Vertex AI uygulamasının kod açık proxy ayarlarında yapılandırılan bağlantı noktasını kullanın (ör. 8080).
  • Adres: RFC 1918 aralığından özel bir IP adresi atayın.
  • Yönlendirme Modu: Bunu EXPLICIT_ROUTING_MODE olarak ayarlayın.

Cloud Shell'de, güvenli web proxy ağ geçidini tanımlamak için gateway.yaml dosyası oluşturun:

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'de Secure Web Proxy örneğini oluşturun:

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

Güvenli Web Proxy'sinin dağıtılması birkaç dakika sürebilir.

e8a4cf23bfc63030.png

7. 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, bu alt ağdan Private Service Connect arayüzüne 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_MANUAL \
    --subnets=intf-subnet

Not: Vertex AI, Google tarafından yönetilen kiracı projesi olarak yapılandırıldığında bu ekte kabul edilen proje kimliğini açıkça belirtmeniz gerekmez. Proje, "Otomatik olarak kabul et" şeklinde yapılandırılmış gibi otomatik olarak eklenir.

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

Üreticinin Private Service Connect arayüzünü oluştururken kullanacağı PSC ağ eki adını (psc-network-attachment) not edin.

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

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

b969cca5242d9c8a.png

8. Ö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 sanal makine için kayıt kümesini oluşturun class-e-vm. 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, Secure Web Proxy için kayıt kümesini oluşturun. IP adresini ortamınızın çıkışına göre güncellediğinizden emin olun.

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

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

Cloud Shell'de, yalnızca proxy kullanılan alt ağdan class-e alt ağına erişime izin veren girişe izin veren güvenlik duvarı kuralını oluşturun. SWP, kaynak adres olarak yalnızca proxy alt ağıyla bağlantı başlattığında.

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 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ılır. Vertex AI Pipelines ile örnekleri içeren tüketici ağı arasındaki veri yolu, Private Service Connect 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'e giriş yapın ve aşağıdakileri uygulayın:

Hizmet hesabını oluşturun.

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

Hizmet hesabını Depolama Yöneticisi rolüyle güncelleyin.

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

Hizmet hesabını AI Platform 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"

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"

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"

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ı içeren bir Vertex AI Workbench örneği oluşturun notebook-sa.

Cloud Shell'de özel istemci ö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 Network Attachment 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

Not: Hizmet aracısı izinlerini güncellemeden önce Vertex AI API'nin etkinleştirildiğinden emin olmak için Cloud Console'da Vertex AI'a gidin.

Cloud Shell'de:

Proje numaranızı alın.

gcloud projects describe $projectid | grep projectNumber

Proje numaranızı ayarlayın.

projectnumber=YOUR-PROJECT-NUMBER

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

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"

Hizmet aracısı hesabını dns.peer rolüyle güncelleme

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.

Varsayılan hizmet hesabını aşağıdaki gibi güncellemek için Cloud Shell'i kullanın:

Varsayılan hizmet hesabını aiplatform.user rolüyle güncelleme

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

Varsayılan hizmet hesabını storage.admin rolüyle güncelleme

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

Varsayılan hizmet hesabını artifactregistry.admin rolüyle güncelleme

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

12. "class-e-vm" üzerinde Apache2'yi yükleyin ve Tcpdump'ı etkinleştirin:

class-e-vm Secure Web Proxy üzerinden apache2'yi yükleyin:

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

Trafiği hedeflere yönlendirmek için Secure Web Proxy tarafından kullanılan yalnızca proxy alt ağında tcpdump filtreleme işlemini yürütün.

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.100.0/24 -nn

Not: JupyterLab oturumunun açılması için workbench-tutorial örnek alt ağında Özel Google Erişimi'ni etkinleştirdiğinizden emin olun.

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 bir not defteri oluşturacaksınız. Bu sayede, class-e-vm gibi RFC 1918 olmayan VM'lere ulaşabilirsiniz. Vertex AI Pipelines'ın rfc1918-vm adresine erişmesi için açık proxy gerekmez. Bunun nedeni, hedefin RFC 1918 IP adresi olmasıdır.

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 adının (workbench-tutorial) 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. Kernel > Python 3'ü seçin.

JupyterLab not defterinizde yeni bir hücre oluşturun, aşağıdaki kodu 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://explicit-swp.demo.com:8080"
  • Tüketici VPC'sinde dağıtılan proxy VM ile bir FQDN ilişkilendirilir. 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 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 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.
  • Buradaki açık yönlendirme modu web proxy'si explicit-swp.demo.com'dur. Çözümleme, tüketicinin VPC'sindeki DNS eşlemesi aracılığıyla yapılır.
  • Bağlantı noktası 8080, Secure Web Proxy'de yapılandırılan dinleme bağlantı noktasıdır (varsayılan).
  • wget ile class-e-vm-demo.com arasındaki bağlantı 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 = "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 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 adrese 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).

a2e0b6d6243f26f1.png

Vurgulanan alan, PSC Ağ Eki'nden Vertex AI Pipelines tarafından kullanılan IP adresini gösterir.

11e411ea919d3bad.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.

2f467254aa0c2e3a.png

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

8d525d3b152bcc61.png

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

a4f9e9167f4ce1ae.png

38972f834aa2bd1d.png

16. TCPDump Doğrulaması

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

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

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

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

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

Tebrikler! Vertex AI Pipelines Private Service Connect arayüzü ile güvenli web proxy üzerinden RFC olmayan IP aralıkları arasında bağlantıyı 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 çok NIC'li bir sanal makine oluşturmasına olanak tanıyan bir ağ eki eklediniz. Tüketici VPC ağında, Vertex'ten doğrudan yönlendirilemeyen class-e-vm örneğine bağlantı sağlayan açık bir proxy dağıtırken DNS eşlemesi oluşturmayı öğrendiniz.

678ba30d64a76795.png

Yapabilecekleriniz

Daha fazla bilgi ve videolar

Referans belgeler