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.
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
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:
- 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
- Compute Ağ Yöneticisi (roles/compute.networkAdmin)
- Compute Örnek Yöneticisi (roles/compute.instanceAdmin)
- Compute Güvenliği Yöneticisi (roles/compute.securityAdmin)
- DNS Yöneticisi (roles/dns.admin)
- IAP Güvenli Tünel Kullanıcısı (roles/iap.tunnelResourceAccessor)
- Logging Yöneticisi (roles/logging.admin)
- Not Defterleri Yöneticisi (roles/notebooks.admin)
- Proje IAM Yöneticisi (roles/resourcemanager.projectIamAdmin)
- Hizmet Hesabı Yöneticisi (roles/iam.serviceAccountAdmin)
- Hizmet Kullanımı Yöneticisi (roles/serviceusage.serviceUsageAdmin)
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
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:
- Depolama Alanı Yöneticisi
- Vertex AI User
- Artifact Registry Yöneticisi
- Cloud Build Düzenleyicisi
- IAM Hizmet Hesabı Kullanıcısı
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
- Google Cloud Console'da Vertex AI Workbench sayfasındaki örnekler sekmesine gidin.
- 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.
- Dosya > Yeni > Not defteri'ni seçin.
- Ç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).
Vurgulanan alan, Vertex AI Pipelines'ın PSC ağ ekinden kullandığı IP adresini gösterir.
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.
Günlükleri Görüntüle'yi seçin.
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.
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.
Yapabilecekleriniz
Daha fazla bilgi ve videolar
Referans belgeleri
- Vertex AI ağ erişimine genel bakış | Google Cloud
- Private Service Connect arayüzleri üzerinden Vertex AI hizmetlerine erişme hakkında | Google Cloud
- Vertex AI Training için Private Service Connect arayüzünü kullanma | Google Cloud
- Vertex AI kaynakları için Private Service Connect arayüzü oluşturma | Google Cloud