1. مقدمه
رابط Private Service Connect منبعی است که به یک شبکه Virtual Private Cloud (VPC) تولید کننده اجازه می دهد تا اتصالات را به مقاصد مختلف در یک شبکه VPC مصرف کننده آغاز کند. شبکه های تولید کننده و مصرف کننده می توانند در پروژه ها و سازمان های مختلف باشند.
اگر پیوست شبکه اتصالی را از رابط Private Service Connect بپذیرد، Google Cloud یک آدرس IP از یک زیرشبکه مصرف کننده که توسط پیوست شبکه مشخص شده است، به رابط اختصاص می دهد. شبکه های مصرف کننده و تولید کننده به هم متصل هستند و می توانند با استفاده از آدرس های IP داخلی ارتباط برقرار کنند.
اتصال بین یک پیوست شبکه و یک رابط Private Service Connect مشابه اتصال بین یک نقطه پایانی Private Service Connect و یک پیوست سرویس است، اما دو تفاوت اساسی دارد:
- یک پیوست شبکه به یک شبکه تولید کننده اجازه می دهد تا اتصالات را به یک شبکه مصرف کننده آغاز کند (خروج سرویس مدیریت شده)، در حالی که یک نقطه پایانی به یک شبکه مصرف کننده اجازه می دهد تا اتصال به یک شبکه تولید کننده را آغاز کند (ورود سرویس مدیریت شده).
- اتصال رابط Private Service Connect انتقالی است. این بدان معناست که یک شبکه تولید کننده می تواند با شبکه های دیگری که به شبکه مصرف کننده متصل هستند ارتباط برقرار کند.
ملاحظات دسترسی PSC-Interface AI Vertex
- PSC-Interface قادر است ترافیک را به VPC یا مقصدهای مبتنی بر Premesis در بلوک آدرس RFC1918 هدایت کند.
- PSC-Interface که بلوکهای آدرس غیر rfc-1918 را هدف قرار میدهد به یک پروکسی صریح مستقر در VPC مصرفکننده با آدرس rfc-1918 نیاز دارد. در استقرار Vertex AI، پروکسی باید به همراه FQDN نقطه پایانی هدف تعریف شود. شکل 1 را ببینید که نشان دهنده پروکسی صریح پیکربندی شده در VPC های مشتریان برای تسهیل مسیریابی به CIDR های غیر rfc-1918 زیر است:
[1] 240.0.0.0/4
[2] 203.0.113.0/2
[3] 10.10.20.0/28 بدون نیاز به پروکسی، در محدوده rfc1918 قرار می گیرد.
- هنگامی که استقرار خود را فقط با یک رابط PSC پیکربندی می کنید، دسترسی به اینترنت پیش فرض خود را حفظ می کند. این ترافیک خروجی مستقیماً از شبکه مستاجر ایمن و تحت مدیریت Google خارج می شود.
ملاحظات Vertex AI PSC-Interface VPC-SC
- وقتی پروژه شما بخشی از محیط کنترلهای سرویس VPC است، دسترسی پیشفرض مستاجرین تحت مدیریت Google به اینترنت توسط محیط مسدود میشود تا از نفوذ دادهها جلوگیری شود.
- برای اجازه دسترسی استقرار به اینترنت عمومی در این سناریو، باید به صراحت یک مسیر خروج ایمن را پیکربندی کنید که ترافیک را از طریق VPC شما هدایت کند. راه پیشنهادی برای دستیابی به این هدف، راهاندازی یک سرور پراکسی در محیط VPC با آدرس RFC1918 و ایجاد یک دروازه NAT Cloud برای اجازه دسترسی به اینترنت پراکسی VM است.
برای اطلاعات بیشتر به منابع زیر مراجعه کنید:
راه اندازی یک رابط Private Service Connect برای منابع Vertex AI | Google Cloud
چیزی که خواهی ساخت
در این آموزش، شما قصد دارید یک راهاندازی جامع Vertex AI Pipelines با رابط Private Service Connect (PSC) بسازید تا امکان اتصال از تولیدکننده به محاسبات مصرفکننده را فراهم کند، همانطور که در شکل 1 نشان داده شده است که نقاط پایانی غیر rfc-1928 را هدف قرار میدهد.
شکل 2
شما یک پیوست شبکه psc را در VPC مصرفکننده ایجاد میکنید که از همتاسازی DNS استفاده میکند تا VMهای مصرفکننده را در پروژه مستاجر میزبان آموزش هوش مصنوعی Vertex حل کند که در موارد استفاده زیر ایجاد میشود:
- استقرار Vertex AI Pipelines و پیکربندی یک VM پراکسی برای عمل به عنوان یک پروکسی صریح، به آن اجازه می دهد یک wget را در برابر یک VM در زیرشبکه کلاس E انجام دهد.
چیزی که یاد خواهید گرفت
- نحوه ایجاد پیوست شبکه
- چگونه یک تولید کننده می تواند از پیوست شبکه برای ایجاد یک رابط PSC استفاده کند
- نحوه برقراری ارتباط از تولید کننده با مصرف کننده با استفاده از DNS Peering
- نحوه برقراری ارتباط با فضای آدرس IP غیر rfc1918 از Vertex AI Pipelines
آنچه شما نیاز دارید
پروژه Google Cloud
مجوزهای IAM
- مدیر شبکه محاسبه (roles/compute.networkAdmin)
- Compute Instance Admin (roles/compute.instanceAdmin)
- مدیریت امنیت محاسبه (roles/compute.securityAdmin)
- مدیر DNS (roles/dns.admin)
- کاربر تونل امن با IAP (roles/iap.tunnelResourceAccessor)
- مدیر ورود به سیستم (roles/logging.admin)
- مدیر نوت بوک (roles/notebooks.admin)
- Project IAM Admin (roles/resourcemanager.projectIamAdmin)
- سرپرست حساب سرویس (roles/iam.serviceAccountAdmin)
- سرپرست استفاده از سرویس (roles/serviceusage.serviceUsageAdmin)
2. قبل از شروع
برای پشتیبانی از آموزش، پروژه را به روز کنید
این آموزش از $variables برای کمک به پیاده سازی پیکربندی gcloud در Cloud Shell استفاده می کند.
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
فعال سازی API
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "dns.googleapis.com"
gcloud services enable "notebooks.googleapis.com"
gcloud services enable "storage.googleapis.com"
gcloud services enable "cloudresourcemanager.googleapis.com"
gcloud services enable "artifactregistry.googleapis.com"
gcloud services enable "cloudbuild.googleapis.com"
3. راه اندازی مصرف کننده
Consumer VPC را ایجاد کنید
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
زیرشبکه های مصرف کننده ایجاد کنید
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1
زیرشبکه Private Service Connect Network Attachment را ایجاد کنید
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
روتر ابری و پیکربندی NAT
در این آموزش از Cloud NAT برای دسترسی به اینترنت برای پروکسی VM استفاده می شود که آدرس IP عمومی ندارد. Cloud NAT این امکان را برای ماشینهای مجازی با آدرسهای IP خصوصی فراهم میکند تا به اینترنت متصل شوند و به آنها اجازه میدهد کارهایی مانند نصب بستههای نرمافزاری را انجام دهند.
در داخل Cloud Shell، روتر ابری را ایجاد کنید.
gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1
در داخل Cloud Shell، دروازه NAT را ایجاد کنید.
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1 --enable-logging --log-filter=ALL
4. IAP را فعال کنید
برای اینکه به IAP اجازه دهید به نمونه های VM شما متصل شود، یک قانون فایروال ایجاد کنید که:
- برای تمام نمونه های VM که می خواهید با استفاده از IAP در دسترس باشند، اعمال می شود.
- به ترافیک ورودی از محدوده IP 35.235.240.0/20 اجازه می دهد. این محدوده شامل تمام آدرس های IP است که IAP برای ارسال TCP استفاده می کند.
در داخل Cloud Shell، قانون فایروال IAP را ایجاد کنید.
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
5. نمونه های VM مصرف کننده ایجاد کنید
در داخل Cloud Shell، نمونه مصرف کننده vm، class-e-vm را ایجاد کنید.
gcloud compute instances create class-e-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=class-e-subnet \
--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، نمونه VM مصرف کننده، proxy-vm را ایجاد کنید، که به عنوان پروکسی صریح برای Vertex AI Pipelines عمل می کند. ما از tinyproxy به عنوان برنامه ای برای پراکسی کردن ترافیک HTTP استفاده خواهیم کرد، اگرچه HTTPS نیز پشتیبانی می شود.
gcloud compute instances create proxy-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--can-ip-forward \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=rfc1918-subnet1 \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install tinyproxy -y
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'proxy server !!' | tee /var/www/html/index.html
EOF"
6. پیوست شبکه Private Service Connect
پیوست های شبکه منابع منطقه ای هستند که نمایانگر سمت مصرف کننده رابط Private Service Connect هستند. شما یک زیرشبکه منفرد را با یک پیوست شبکه مرتبط میکنید، و سازنده IPها را از آن زیرشبکه به رابط Private Service Connect اختصاص میدهد. زیرشبکه باید در همان ناحیه پیوست شبکه باشد. یک پیوست شبکه باید در همان منطقه ای باشد که سرویس تولیدکننده است.
پیوست شبکه را ایجاد کنید
در داخل Cloud Shell، پیوست شبکه را ایجاد کنید.
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_AUTOMATIC \
--subnets=intf-subnet
پیوست های شبکه را فهرست کنید
در داخل Cloud Shell، پیوست شبکه را فهرست کنید.
gcloud compute network-attachments list
پیوست های شبکه را شرح دهید
در داخل Cloud Shell، پیوست شبکه را شرح دهید.
gcloud compute network-attachments describe psc-network-attachment --region=us-central1
نام psc-network-attachment، psc-network-attachment را که توسط سازنده هنگام ایجاد رابط اتصال سرویس خصوصی استفاده می شود، یادداشت کنید.
برای مشاهده URL پیوست شبکه PSC در Cloud Console، به مسیر زیر بروید:
خدمات شبکه → اتصال سرویس خصوصی → پیوست شبکه → psc-network-attachment
7. منطقه DNS خصوصی
شما یک Cloud DNS Zone برای demo.com ایجاد میکنید و آن را با سوابق A پر میکنید که به آدرسهای IP ماشینهای مجازی شما اشاره میکنند. بعداً، همتاسازی DNS در کار Pipelines Vertex AI مستقر خواهد شد که به آن امکان دسترسی به سوابق DNS مصرف کننده را می دهد.
در داخل Cloud Shell موارد زیر را انجام دهید:
gcloud dns --project=$projectid managed-zones create private-dns-codelab --description="" --dns-name="demo.com." --visibility="private" --networks="https://compute.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc"
در داخل Cloud Shell، برای به دست آوردن آدرس های IP مربوطه، توضیحاتی را در مورد نمونه های VM انجام دهید.
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، رکوردهای تنظیم شده برای VM، class-e-vm را ایجاد کنید، اطمینان حاصل کنید که آدرس IP را بر اساس خروجی محیط خود به روز کنید.
gcloud dns --project=$projectid record-sets create class-e-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="240.0.0.2"
در داخل Cloud Shell، رکوردهای تنظیم شده برای VM، proxy-vm را ایجاد کنید، اطمینان حاصل کنید که آدرس IP را بر اساس خروجی محیط خود به روز کنید.
gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"
یک قانون Cloud Firewall ایجاد کنید تا اجازه دسترسی از رابط PSC را بدهد
در بخش زیر، یک قانون فایروال ایجاد کنید که به ترافیک ناشی از پیوست شبکه PSC اجازه می دهد به منابع محاسبه RFC1918 در VPC مصرف کنندگان دسترسی داشته باشد.
در Cloud Shell، قانون فایروال ورودی را ایجاد کنید که اجازه دسترسی از زیر شبکه PSC Network Attachment به proxy-vm را می دهد.
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، قانون دیوار آتش ورودی را ایجاد کنید که اجازه دسترسی از زیرشبکه proxy-vm به زیر شبکه class-e را می دهد.
gcloud compute firewall-rules create allow-access-to-class-e \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="10.10.10.0/28" \
--destination-ranges="240.0.0.0/4" \
--enable-logging
8. پروکسی صریح را به روز کنید
در بخش بعدی، باید ssh را به پروکسی صریح وارد کنید و فایل پیکربندی tinyproxy.conf را بهروزرسانی کنید و سپس یک تنظیم مجدد انجام دهید.
از Cloud Shell
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
فایل پیکربندی tinyproxy را باز کنید، با استفاده از ویرایشگر یا انتخاب خود بهروزرسانی کنید. در زیر یک مثال با استفاده از VIM آورده شده است.
sudo vim /etc/tinyproxy/tinyproxy.conf
# Locate the "Listen" configuration line to restrict listening to only its private IP address of the Proxy-VM, rather than all interfaces.
Listen 10.10.10.2
# Locate the "Allow" configuration line to allow requests ONLY from the PSC Network Attachment Subnet
Allow 192.168.10.0/24
Save the configs by the following steps:
1. Press the `ESC` key to enter Command Mode.
2. Type `:wq` to save (w) and quit (q).
3. Press `Enter`
Restart the tinyproxy service to apply the changes:
sudo systemctl restart tinyproxy
Validate the tinyproxy service is running:
sudo systemctl status tinyproxy
Perform an exit returning to cloud shell
exit
9. یک نوت بوک Jupyter ایجاد کنید
بخش زیر شما را از طریق ایجاد یک نوت بوک Jupyter راهنمایی می کند. این نوت بوک برای استقرار یک Vertex AI Pipelines Job استفاده می شود که یک wget از Vertex AI Pipelines به نمونه های آزمایشی ارسال می کند. مسیر داده بین Pipelines Vertex AI و شبکه مصرف کننده حاوی نمونه ها از یک رابط شبکه اتصال سرویس خصوصی استفاده می کند.
یک حساب کاربری سرویس مدیریت شده ایجاد کنید
در بخش زیر، یک حساب کاربری ایجاد خواهید کرد که با نمونه Vertex AI Workbench استفاده شده در آموزش مرتبط خواهد بود.
در آموزش، حساب سرویس دارای نقش های زیر خواهد بود:
در داخل Cloud Shell، حساب سرویس را ایجاد کنید.
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
در داخل Cloud Shell، حساب سرویس را با نقش Storage Admin بهروزرسانی کنید.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
در داخل Cloud Shell، حساب سرویس را با نقش Vertex AI User به روز کنید.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
در داخل Cloud Shell، حساب سرویس را با نقش Artifact Registry Admin بهروزرسانی کنید.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
در داخل Cloud Shell، حساب سرویس را با نقش Cloud Build Editor به روز کنید.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
در داخل Cloud Shell، به حساب سرویس نوت بوک اجازه دهید از حساب خدمات پیش فرض Compute Engine استفاده کند.
gcloud iam service-accounts add-iam-policy-binding \
$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')-compute@developer.gserviceaccount.com \
--member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
10. یک Vertex AI Workbench Instance ایجاد کنید
در بخش زیر، یک نمونه Vertex AI Workbench ایجاد کنید که حساب سرویس قبلاً ایجاد شده، notebook-sa را در خود جای دهد.
Inside Cloud Shell نمونه خصوصی مشتری را ایجاد کنید.
gcloud workbench instances create workbench-tutorial --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=rfc1918-subnet1 --disable-public-ip --shielded-secure-boot=true --shielded-integrity-monitoring=true --shielded-vtpm=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com
11. Vertex AI Service Agent Update
Vertex AI از طرف شما برای انجام عملیاتی مانند دریافت آدرس IP از زیرشبکه PSC Network Attachment که برای ایجاد رابط PSC استفاده می شود، عمل می کند. برای انجام این کار، Vertex AI از یک عامل سرویس (ذکر شده در زیر) استفاده می کند که به مجوز Network Admin نیاز دارد.
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
در داخل Cloud Shell، شماره پروژه خود را بدست آورید.
gcloud projects describe $projectid | grep projectNumber
در داخل Cloud Shell، شماره پروژه خود را بدست آورید.
gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'
در داخل Cloud Shell، شماره پروژه خود را تنظیم کنید.
projectnumber=YOUR-PROJECT-Number
در داخل Cloud Shell، یک حساب سرویس برای پلتفرم هوش مصنوعی ایجاد کنید. اگر یک حساب سرویس موجود در پروژه خود دارید، از این مرحله رد شوید.
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
در داخل Cloud Shell، حساب عامل سرویس را با نقش compute.networkAdmin بهروزرسانی کنید.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
در داخل Cloud Shell، حساب عامل سرویس را با نقش dns.peer به روز کنید
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"
به روز رسانی حساب پیش فرض سرویس
Compute Engine API را فعال کنید و به حساب سرویس پیش فرض خود دسترسی به Vertex AI بدهید . توجه داشته باشید که ممکن است مدتی طول بکشد تا تغییر دسترسی منتشر شود.
در داخل Cloud Shell، حساب سرویس پیش فرض را با role aiplatform.user به روز کنید
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
در داخل Cloud Shell، حساب سرویس پیشفرض را با role storage.admin بهروزرسانی کنید
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
در داخل Cloud Shell، حساب سرویس پیشفرض را با role storage.admin بهروزرسانی کنید
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. Tcpdump را فعال کنید
برای اعتبارسنجی اتصال IP از Vertex AI Pipelines، میتوانیم از TCPDUMP استفاده کنیم. این به ما این امکان را می دهد که هنگام فراخوانی درخواست دریافت از Vertex AI Pipelines به vm, class-e-vm.demo.com (240.0.0.0/4) ارتباطاتی را که از زیرشبکه پیوست شبکه PSC، 192.168.10.0/28 نشات می گیرد، مشاهده کنیم.
از Cloud Shell ssh به پروکسی vm.
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
از سیستم عامل proxy-vm، فیلتر tcpdump را در زیرشبکه پیوست شبکه class-e-vm و PSC اجرا کنید.
sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn
یک تب جدید Cloud Shell باز کنید، متغیر پروژه خود را به روز کنید و ssh را به class-e-vm وارد کنید.
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
از سیستم عامل class-e-vm، فیلتر tcpdump را در زیرشبکه proxy-vm اجرا کنید.
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. استقرار Vertex AI Pipelines Job
در بخش زیر، یک نوت بوک برای اجرای موفقیت آمیز wget از Vertex AI Pipelines به پراکسی صریح ایجاد خواهید کرد. این به شما امکان می دهد به ماشین های مجازی غیر RFC 1918 مانند class-e-vm دسترسی پیدا کنید. یک پروکسی صریح برای Vertex AI Pipelines برای دسترسی به rfc1918-vm لازم نیست، زیرا هدف آن یک آدرس IP RFC 1918 است.
کار آموزشی را در نمونه Vertex AI Workbench اجرا کنید.
- در کنسول Google Cloud، به تب instances در صفحه Vertex AI Workbench بروید.
- در کنار نام نمونه Vertex AI Workbench خود (workbench-tutorial)، روی Open JupyterLab کلیک کنید. نمونه Vertex AI Workbench شما در JupyterLab باز می شود.
- File > New > Notebook را انتخاب کنید
- هسته > پایتون 3 را انتخاب کنید
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
# Install gcloud
!pip install google-cloud
# Install the pipeline required packages
!pip install --upgrade google-cloud-aiplatform \
google-cloud-storage \
kfp \
google-cloud-pipeline-components
# Import libraries
from time import gmtime, strftime
import json
import requests
در نوت بوک JupyterLab، یک سلول جدید ایجاد کنید، به روز رسانی کنید و موارد زیر را اجرا کنید. اطمینان حاصل کنید که PROJECT_ID را با جزئیات محیط خود به روز کنید.
import json
import requests
import pprint
PROJECT_ID = 'YOUR-PROJECT-ID' #Enter your project ID
PROJECT_NUMBER=!gcloud projects list --filter="project_id:$PROJECT_ID" --format="value(PROJECT_NUMBER)"
PROJECT_NUMBER=str(PROJECT_NUMBER).strip('[').strip(']').strip("'")
print(PROJECT_NUMBER)
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
# us-central1 is used for the codelab
REGION = "us-central1" #@param {type:"string"}
SERVICE_NAME = "aiplatform" #@param {type:"string"}
SERVICE ="{}.googleapis.com".format(SERVICE_NAME)
ENDPOINT="{}-{}.googleapis.com".format(REGION, SERVICE_NAME)
API_VERSION = "v1" # @param {type: "string"}
LOCATION = REGION
در نوت بوک JupyterLab خود، یک سلول جدید ایجاد کنید و پیکربندی زیر را اجرا کنید، به نکات برجسته زیر توجه کنید:
- proxy_server = "http://proxy-vm.demo.com:8888" FQDN با پروکسی vm مستقر در VPC مصرف کننده مرتبط است. ما از همتاسازی DNS برای حل و فصل FQDN در مرحله بعد استفاده می کنیم.
%%writefile main.py
import logging
import socket
import sys
import os
def make_api_request(url: str, proxy_vm_ip: str, proxy_vm_port: str):
"""
Makes a GET request to a non-rfc1918 API and saves the response.
Args:
url: The URL of the API to send the request to.
"""
import requests
try:
# response = requests.get(url)
proxy_server = f"http://proxy-vm.demo.com:8888" # replace with you VM's IP and proxy port.
proxies = {
"http": proxy_server,
"https": proxy_server,
}
response = requests.get(url, proxies=proxies)
logging.info(response.text)
response.raise_for_status() # Raise an exception for bad status codes
logging.info(f"Successfully fetched data from {url}")
except requests.exceptions.RequestException as e:
logging.error(f"An error occurred: {e}")
raise e
if __name__ == '__main__':
# Configure logging to print clearly to the console
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s',
stream=sys.stdout
)
url_to_test = os.environ['NONRFC_URL']
proxy_vm_ip = os.environ['PROXY_VM_IP']
proxy_vm_port = os.environ['PROXY_VM_PORT']
logging.info(f"url_to_test: {url_to_test}")
logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
logging.info(f"proxy_vm_port: {proxy_vm_port}")
make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
%%writefile Dockerfile
FROM python:3.9-slim
RUN apt-get update && \
apt-get install -y iputils-ping && \
apt-get install -y wget
RUN pip install cloudml-hypertune requests kfp
COPY main.py /main.py
ENTRYPOINT ["python3", "/main.py"]
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
IMAGE_PROJECT = PROJECT_ID
IMAGE_REPO = 'pipelines-test-repo-psc'
IMAGE_NAME = 'nonrfc-ip-call'
TAG = 'v1'
IMAGE_URI= f'us-central1-docker.pkg.dev/{IMAGE_PROJECT}/{IMAGE_REPO}/{IMAGE_NAME}:{TAG}'
IMAGE_URI
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
!gcloud auth configure-docker us-docker.pkg.dev --quiet
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید. در صورت وجود خطا (gcloud.builds.submit) را نادیده بگیرید.
!gcloud builds submit --tag {IMAGE_URI} --region=us-central1
در نوت بوک JupyterLab، سلول زیر را ایجاد و اجرا کنید، به نکات برجسته زیر توجه کنید:
- DNS Peering به VPCهای مصرف کننده با استفاده از dnsPeeringConfigs (dnsPeeringConfigs) برای نام دامنه demo.com پیکربندی شده است.
- پروکسی صریح، که به عنوان متغیر PROXY_VM_IP تعریف شده است، proxy-vm.demo.com است. وضوح از طریق همتاسازی DNS در VPC مصرف کننده انجام می شود.
- پورت 8888 پورت گوش دادن (پیشفرض) است که در tinyproxy پیکربندی شده است
- Wget به class-e-vm-demo.com از طریق همتاسازی DNS حل می شود
- کد «psc-network-attachment» را برای Vertex مشخص میکند و آن را قادر میسازد تا از زیرشبکه پیوست شبکه برای استقرار دو نمونه PSC Interface استفاده کند.
import json
from datetime import datetime
JOB_ID_PREFIX='test_psci-nonRFC' #@param {type:"string"}
JOB_ID = '{}_{}'.format(JOB_ID_PREFIX, datetime.now().strftime("%Y%m%d%H%M%S"))
# PSC-I configs
PRODUCER_PROJECT_ID = PROJECT_ID
DNS_DOMAIN = 'class-e-vm.demo.com' #@param {type:"string"}
NON_RFC_URL = f"http://{DNS_DOMAIN}"
PROXY_VM_IP = "proxy-vm.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8888" #@param {type:"string"}
CUSTOM_JOB = {
"display_name": JOB_ID,
"job_spec": {
"worker_pool_specs": [
{
"machine_spec": {
"machine_type": "n1-standard-4",
},
"replica_count": 1,
"container_spec": {
"image_uri": IMAGE_URI,
"env": [{
"name": "NONRFC_URL",
"value": NON_RFC_URL
},
{
"name": "PROXY_VM_IP",
"value": PROXY_VM_IP
},
{
"name": "PROXY_VM_PORT",
"value": PROXY_VM_PORT
}]
},
},
],
"enable_web_access": True,
"psc_interface_config": {
"network_attachment": "psc-network-attachment",
"dns_peering_configs": [
{
"domain": "demo.com.",
"target_project": PROJECT_ID,
"target_network": "consumer-vpc"
},
]
},
}
}
print(json.dumps(CUSTOM_JOB, indent=2))
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
import requests
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/customJobs/"
print("request_uri: ", request_uri)
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
response_autopush = requests.post(request_uri, json=CUSTOM_JOB, headers=headers)
response = response_autopush
print("response:", response)
if response.reason == 'OK':
job_name = response.json()['name']
job_id = job_name.split('/')[-1]
print("Created Job: ", response.json()['name'])
else:
print(response.text)
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
# Print KFP SDK version (should be >= 1.6)
! python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
# Print AI Platform version
! python3 -c "from google.cloud import aiplatform; print('AI Platform version: {}'.format(aiplatform.__version__))"
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
!gcloud storage buckets create gs://{BUCKET_URI}
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
# pipeline parameters
CACHE_PIPELINE = False # @param {type: "string"}
_DEFAULT_IMAGE = IMAGE_URI
BUCKET_URI = "gs://{BUCKET_URI}" # @param {type: "string"}
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/intro"
PIPELINE_DISPLAY_NAME = "pipeline_nonRFCIP" # @param {type: "string"}
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
from re import S
import kfp
from kfp import dsl
from kfp.dsl import container_component, ContainerSpec
from kfp import compiler
from google.cloud import aiplatform
# ==== Component with env variable ====
@container_component
def dns_peering_test_op(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
return ContainerSpec(
image=_DEFAULT_IMAGE,
command=["bash", "-c"],
args=[
"""
apt-get update && apt-get install inetutils-traceroute inetutils-ping netcat-openbsd curl -y
echo "Local IP(s): $(hostname -I)"
echo "Attempting to trace route to %s"
traceroute -w 1 -m 7 "%s"
echo "Sending curl requests to http://%s via proxy %s:%s and recording trace..."
if curl -L -v --trace-ascii /dev/stdout -x http://%s:%s "http://%s"; then
echo "Curl request succeeded!"
else
echo "Curl request failed!"
exit 1
fi
""" % (dns_domain, dns_domain, dns_domain, proxy_vm_ip, proxy_vm_port, proxy_vm_ip, proxy_vm_port, dns_domain)
]
)
# ==== Pipeline ====
@dsl.pipeline(
name="dns-peering-test-pipeline",
description="Test DNS Peering using env variable",
pipeline_root=PIPELINE_ROOT,
)
def dns_peering_test_pipeline(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
dns_test_task = dns_peering_test_op(dns_domain=dns_domain, proxy_vm_ip=proxy_vm_ip, proxy_vm_port=proxy_vm_port)
dns_test_task.set_caching_options(enable_caching=CACHE_PIPELINE)
# ==== Compile pipeline ====
if __name__ == "__main__":
aiplatform.init(project=PROJECT_ID, location=LOCATION)
compiler.Compiler().compile(
pipeline_func=dns_peering_test_pipeline,
package_path="dns_peering_test_pipeline.yaml",
)
print("✅ Pipeline compiled to dns_peering_test_pipeline.yaml")
در نوت بوک JupyterLab یک سلول جدید ایجاد کنید و موارد زیر را اجرا کنید.
# Define the PipelineJob body; see API Reference https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.pipelineJobs/create
import requests, json
import datetime
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/pipelineJobs/"
print("request_uri: ", request_uri)
14. اعتبارسنجی رابط PSC
همچنین می توانید IP های پیوست شبکه مورد استفاده توسط Vertax AI Pipelines را با پیمایش به موارد زیر مشاهده کنید:
خدمات شبکه → اتصال سرویس خصوصی → پیوست شبکه → psc-network-attachment
پروژه مستاجر را انتخاب کنید (نام پروژه به -tp ختم می شود)
فیلد برجسته نشان دهنده آدرس IP مورد استفاده توسط Vertex AI Pipelines از پیوست شبکه PSC است.
15. Cloud Logging Validation
کار Vertex AI Pipelines برای اولین بار تقریباً 14 دقیقه طول می کشد، اجراهای بعدی بسیار کوتاهتر هستند. برای تایید یک نتیجه موفقیت آمیز موارد زیر را انجام دهید:
به Vertex AI → Training → Custom jobs بروید
کار سفارشی اجرا شده را انتخاب کنید
View Logs را انتخاب کنید
هنگامی که Cloud Logging در دسترس است، Run Query را انتخاب کنید که انتخاب هایلایت شده زیر را ایجاد می کند و wget موفقی را از Vertex AI Pipelines به class-e-vm تأیید می کند.
16. اعتبارسنجی TCPDump
اجازه دهید خروجی TCPDUMP را بررسی کنیم که اتصال به محاسبه نمونهها را بیشتر تأیید میکند:
از proxy-vm HTTP GET و 200 OK را مشاهده کنید
03:05:34.778574 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778946 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.778974 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781999 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906678 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
از class-e-vm HTTP GET و 200 OK را مشاهده کنید
03:05:34.778768 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778819 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.781815 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781856 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906503 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
17. پاکسازی کنید
از Cloud Shell، اجزای آموزشی را حذف کنید.
gcloud compute instances delete proxy-vm --zone=us-central1-a --quiet
gcloud compute instances delete workbench-tutorial --zone=us-central1-a --quiet
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet
gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet
gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet
gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns record-sets delete proxy-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns managed-zones delete private-dns-codelab
gcloud compute networks delete consumer-vpc --quiet
18. تبریک می گویم
تبریک میگوییم، شما با موفقیت یک رابط اتصال سرویس خصوصی را با Pipelines Vertex AI پیکربندی و تأیید کردید.
شما زیرساخت مصرف کننده را ایجاد کردید، و یک پیوست شبکه اضافه کردید که به تولید کننده اجازه می داد یک VM چندنیک برای ایجاد پل ارتباطی بین مصرف کننده و تولید کننده ایجاد کند. شما یاد گرفتید که چگونه همزمان با ایجاد یک پروکسی صریح در شبکه VPC مصرف کننده که امکان اتصال به نمونه کلاس-e-vm را که مستقیماً از Vertex قابل مسیریابی نیست، ایجاد کنید.
Cosmopup فکر می کند آموزش ها عالی هستند!!