پروکسی صریح رابط PSC Pipelines Vertex AI

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 خارج می شود.

476f87a96f153b95.png

ملاحظات 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

782ba8f1f3c3f522.png

شما یک پیوست شبکه psc را در VPC مصرف‌کننده ایجاد می‌کنید که از همتاسازی DNS استفاده می‌کند تا VMهای مصرف‌کننده را در پروژه مستاجر میزبان آموزش هوش مصنوعی Vertex حل کند که در موارد استفاده زیر ایجاد می‌شود:

  1. استقرار Vertex AI Pipelines و پیکربندی یک VM پراکسی برای عمل به عنوان یک پروکسی صریح، به آن اجازه می دهد یک wget را در برابر یک VM در زیرشبکه کلاس E انجام دهد.

چیزی که یاد خواهید گرفت

  • نحوه ایجاد پیوست شبکه
  • چگونه یک تولید کننده می تواند از پیوست شبکه برای ایجاد یک رابط PSC استفاده کند
  • نحوه برقراری ارتباط از تولید کننده با مصرف کننده با استفاده از DNS Peering
  • نحوه برقراری ارتباط با فضای آدرس IP غیر rfc1918 از Vertex AI Pipelines

آنچه شما نیاز دارید

پروژه Google Cloud

مجوزهای IAM

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

e191e54a103d2222.png

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 اجرا کنید.

  1. در کنسول Google Cloud، به تب instances در صفحه Vertex AI Workbench بروید.
  2. در کنار نام نمونه Vertex AI Workbench خود (workbench-tutorial)، روی Open JupyterLab کلیک کنید. نمونه Vertex AI Workbench شما در JupyterLab باز می شود.
  3. File > New > Notebook را انتخاب کنید
  4. هسته > پایتون 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 ختم می شود)

f47150235fedb8ce.png

فیلد برجسته نشان دهنده آدرس IP مورد استفاده توسط Vertex AI Pipelines از پیوست شبکه PSC است.

39e7b251aeb4f191.png

15. Cloud Logging Validation

کار Vertex AI Pipelines برای اولین بار تقریباً 14 دقیقه طول می کشد، اجراهای بعدی بسیار کوتاهتر هستند. برای تایید یک نتیجه موفقیت آمیز موارد زیر را انجام دهید:

به Vertex AI → Training → Custom jobs بروید

کار سفارشی اجرا شده را انتخاب کنید

a9be0395c842aa6f.png

View Logs را انتخاب کنید

53e30765ba5827f3.png

هنگامی که Cloud Logging در دسترس است، Run Query را انتخاب کنید که انتخاب هایلایت شده زیر را ایجاد می کند و wget موفقی را از Vertex AI Pipelines به class-e-vm تأیید می کند.

f2c5d9fdf5cc8bed.png

3b3788603bb433ee.png

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 فکر می کند آموزش ها عالی هستند!!

c911c127bffdee57.jpeg

بعدش چی؟

ادامه مطلب و ویدیوها

اسناد مرجع