1. مقدمة
واجهة Private Service Connect هي مورد يتيح لشبكة السحابة الإلكترونية الخاصة الافتراضية (VPC) الخاصة بموفّر الخدمة بدء عمليات ربط بمقاصد مختلفة في شبكة السحابة الإلكترونية الخاصة الافتراضية الخاصة بالمستهلك. يمكن أن تكون شبكات المنتجين والمستهلكين في مشاريع ومؤسسات مختلفة.
إذا قبلت أداة ربط الشبكة اتصالاً من واجهة Private Service Connect، يخصّص Google Cloud للواجهة عنوان IP من شبكة فرعية للمستهلك يحدّدها أداة ربط الشبكة. ترتبط شبكات المستهلكين والمنتجين ويمكنها التواصل باستخدام عناوين IP الداخلية.
يشبه الاتصال بين مرفق الشبكة وواجهة Private Service Connect الاتصال بين نقطة نهاية Private Service Connect ومرفق الخدمة، ولكنّه يختلف عنه في نقطتَين أساسيتَين:
- تتيح مرفقات الشبكة لشبكة المنتج بدء الاتصالات بشبكة المستهلك (خروج الخدمة المُدارة)، بينما تتيح نقطة النهاية لشبكة المستهلك بدء الاتصالات بشبكة المنتج (دخول الخدمة المُدارة).
- يكون اتصال واجهة Private Service Connect متعديًا. وهذا يعني أنّه يمكن لشبكة منتِجة التواصل مع شبكات أخرى مرتبطة بشبكة المستهلك.
اعتبارات إمكانية الوصول إلى واجهة PSC في Vertex AI
- يمكن لواجهة PSC توجيه الزيارات إلى شبكة VPC أو الوجهات المحلية ضمن حظر عناوين RFC1918.
- يتطلّب استهداف واجهة PSC لكتل العناوين غير RFC-1918 نشر وكيل صريح في شبكة VPC الخاصة بالمستهلك مع عنوان RFC-1918. ضمن عملية نشر Vertex AI، يجب تحديد الخادم الوكيل مع اسم نطاق مؤهَّل بالكامل لنقطة النهاية المستهدَفة. راجِع الشكل 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.
اعتبارات حول واجهة PSC في Vertex AI مع عناصر التحكّم في سحابة VPC
- عندما يكون مشروعك جزءًا من حدود "عناصر التحكّم في خدمة السحابة الإلكترونية الافتراضية الخاصة"، يتم حظر الوصول التلقائي إلى الإنترنت للمستأجرين الذين تديرهم Google من خلال الحدود لمنع تسريب البيانات.
- للسماح بالوصول إلى الإنترنت العام في هذا السيناريو، يجب ضبط مسار خروج آمن يوجّه حركة البيانات من خلال شبكة VPC. الطريقة المقترَحة لتحقيق ذلك هي إعداد خادم وكيل داخل محيط شبكتك الافتراضية الخاصة (VPC) باستخدام عنوان RFC1918 وإنشاء بوابة Cloud NAT للسماح للجهاز الظاهري الخاص بالوكيل بالوصول إلى الإنترنت.
للحصول على معلومات إضافية، يُرجى الاطّلاع على المراجع التالية:
إعداد واجهة Private Service Connect لموارد Vertex AI | Google Cloud
ما ستنشئه
في هذا البرنامج التعليمي، ستنشئ عملية نشر شاملة لخدمة Vertex AI Pipelines باستخدام واجهة Private Service Connect (PSC) للسماح بالاتصال من المنتج إلى الحساب الخاص بالمستهلك كما هو موضّح في الشكل 1 الذي يستهدف نقاط نهاية غير rfc-1928.
الشكل 2
ستنشئ عملية ربط واحدة بين شبكة psc وشبكة VPC الخاصة بالمستهلك، وذلك باستخدام تبادل المعلومات بين نظام أسماء النطاقات (DNS) لتحديد الأجهزة الافتراضية الخاصة بالمستهلكين في مشروع المستأجر الذي يستضيف Vertex AI Training، ما يؤدي إلى حالات الاستخدام التالية:
- نشر Vertex AI Pipelines وضبط جهاز افتراضي كخادم وكيل صريح، ما يسمح له بتنفيذ wget على جهاز افتراضي في الشبكة الفرعية من الفئة E
ما ستتعلمه
- كيفية إنشاء مرفق شبكة
- كيف يمكن لمقدّم الخدمة استخدام مرفق شبكة لإنشاء واجهة PSC؟
- كيفية إنشاء اتصال من المنتِج إلى المستهلك باستخدام DNS Peering
- كيفية إنشاء اتصال بمساحة عنوان IP غير RFC1918 من Vertex AI Pipelines
المتطلبات
مشروع Google Cloud
أذونات "إدارة الهوية وإمكانية الوصول"
- مشرف شبكة Cloud Compute (roles/compute.networkAdmin)
- مشرف مثيل Cloud Compute (roles/compute.instanceAdmin)
- مشرف أمان Compute (roles/compute.securityAdmin)
- مشرف نظام أسماء النطاقات (roles/dns.admin)
- مستخدم الاتصال النفقي المحمي بواسطة IAP (roles/iap.tunnelResourceAccessor)
- مشرف تسجيل الدخول (roles/logging.admin)
- مشرف أجهزة الكمبيوتر الدفتري (roles/notebooks.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
تفعيل واجهة برمجة التطبيقات
داخل 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- إعداد المستهلك
إنشاء شبكة 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
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
إعداد Cloud Router و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. تفعيل عمليات الشراء داخل التطبيق
للسماح لميزة "الوصول إلى الأجهزة الافتراضية عبر الإنترنت" بالاتصال بأجهزة 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- إنشاء مثيلات أجهزة افتراضية للمستهلكين
داخل Cloud Shell، أنشئ مثيل الجهاز الافتراضي للمستهلك، 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، أنشئ مثيل الجهاز الظاهري للمستهلك، 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، الذي سيستخدمه مقدّم الخدمة عند إنشاء واجهة Private Service Connect.
لعرض عنوان URL لملف PSC Network Attachment في Cloud Console، انتقِل إلى ما يلي:
خدمات الشبكة (Network Services) → خدمة Private Service Connect → ربط الشبكة (Network Attachment) → psc-network-attachment
7. منطقة نظام أسماء النطاقات الخاص
ستنشئ منطقة Cloud DNS لـ demo.com وتملأها بسجلّات A تشير إلى عناوين IP الخاصة بأجهزتك الافتراضية. في وقت لاحق، سيتم نشر ربط نظام أسماء النطاقات في مهمة Vertex AI Pipelines، ما سيسمح لها بالوصول إلى سجلّات نظام أسماء النطاقات الخاصة بالمستهلك.
داخل 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، نفِّذ وصفًا لآلات VM الافتراضية للحصول على عناوين IP الخاصة بها.
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، أنشئ مجموعة السجلات للجهاز الافتراضي 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"
إنشاء قاعدة "جدار حماية السحابة الإلكترونية" للسماح بالوصول من واجهة PSC
في القسم التالي، أنشئ قاعدة جدار حماية تسمح بنقل البيانات من موارد الحوسبة RFC1918 التي يمكن الوصول إليها من خلال Network Attachment في شبكة PSC إلى شبكة VPC الخاصة بالمستهلكين.
في Cloud Shell، أنشئ قاعدة جدار الحماية التي تتيح الدخول والتي تسمح بالوصول من الشبكة الفرعية لملحق شبكة PSC إلى 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 التي ترسل طلب wget من Vertex AI Pipelines إلى مثيلات الاختبار. يستخدم مسار البيانات بين Vertex AI Pipelines وشبكة المستهلك التي تحتوي على المثيلات واجهة شبكة Private Service Connect.
إنشاء حساب خدمة مُدار من قِبل المستخدم
في القسم التالي، ستنشئ حساب خدمة سيتم ربطه بمثيل Vertex AI Workbench المستخدَم في البرنامج التعليمي.
في البرنامج التعليمي، سيتم تطبيق الأدوار التالية على حساب الخدمة:
- مشرف مساحة التخزين
- مستخدم Vertex AI
- مشرف Artifact Registry
- Cloud Build Editor
- مستخدم حساب خدمة إدارة الهوية وإمكانية الوصول
داخل Cloud Shell، أنشئ حساب الخدمة.
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
داخل Cloud Shell، عدِّل حساب الخدمة باستخدام دور "مشرف التخزين".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
داخل Cloud Shell، عدِّل حساب الخدمة باستخدام دور "مستخدم Vertex AI".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
في Cloud Shell، عدِّل حساب الخدمة باستخدام دور "مشرف Artifact Registry".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
في Cloud Shell، عدِّل حساب الخدمة باستخدام دور "محرِّر Cloud Build".
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
في القسم التالي، أنشئ مثيلاً من Vertex AI Workbench يتضمّن حساب الخدمة الذي تم إنشاؤه سابقًا، notebook-sa.
داخل 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
تتولّى Vertex AI نيابةً عنك تنفيذ عمليات، مثل الحصول على عنوان IP من الشبكة الفرعية لمرفق شبكة PSC المستخدَمة لإنشاء واجهة PSC. لإجراء ذلك، تستخدم Vertex AI وكيل خدمة (مُدرَج أدناه) يتطلّب إذن مشرف الشبكة.
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، أنشئ حساب خدمة لمنصة AI Platform. تخطَّ هذه الخطوة إذا كان لديك حساب خدمة حالي في مشروعك.
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، عدِّل حساب الخدمة التلقائي باستخدام الدور aiplatform.user
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
في Cloud Shell، عدِّل حساب الخدمة التلقائي باستخدام دور storage.admin.
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
في Cloud Shell، عدِّل حساب الخدمة التلقائي باستخدام دور 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. سيسمح لنا ذلك بمراقبة الاتصال الصادر من الشبكة الفرعية "مرفق شبكة PSC"، 192.168.10.0/28 عند استدعاء طلب get من Vertex AI Pipelines إلى الجهاز الظاهري، class-e-vm.demo.com (240.0.0.0/4).
من Cloud Shell، يمكنك استخدام ssh للوصول إلى الجهاز الظاهري للخادم الوكيل.
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 جديدة، وعدِّل متغيّر مشروعك، ثم سجِّل الدخول إلى class-e-vm باستخدام ssh.
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
من نظام التشغيل الخاص بالجهاز الظاهري من الفئة E، نفِّذ فلترة tcpdump على الشبكة الفرعية للجهاز الظاهري للوكيل.
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. Deploy 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 Console، انتقِل إلى علامة التبويب "الأجهزة الافتراضية" في صفحة Vertex AI Workbench.
- بجانب اسم مثيل Vertex AI Workbench (workbench-tutorial)، انقر على "فتح JupyterLab". سيتم فتح مثيل Vertex AI Workbench في JupyterLab.
- انقر على "ملف" > "جديد" > "دفتر ملاحظات".
- اختَر Kernel > Python 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) بالجهاز الظاهري للخادم الوكيل الذي تم نشره في شبكة VPC الخاصة بالمستهلك. نستخدم ربط نظام أسماء النطاقات لتحديد اسم النطاق المؤهّل بالكامل في خطوة لاحقة.
%%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) مع شبكات VPC الخاصة بالمستهلكين باستخدام dnsPeeringConfigs (dnsPeeringConfigs) لاسم النطاق demo.com.
- الخادم الوكيل الصريح، الذي تم تعريفه على أنّه المتغيّر PROXY_VM_IP، هو proxy-vm.demo.com. تتم معالجة عملية تحليل الاسم من خلال ربط نظام أسماء النطاقات داخل شبكة VPC الخاصة بالمستهلك.
- المنفذ 8888 هو منفذ الاستماع (تلقائي) الذي تم ضبطه في tinyproxy
- يتم التحويل باستخدام نظام أسماء النطاقات (DNS) لـ Wget إلى class-e-vm-demo.com من خلال تبادل DNS
- يحدّد الرمز "psc-network-attachment" لخدمة Vertex، ما يتيح لها استخدام الشبكة الفرعية المرفقة بالشبكة لنشر مثيلَين من واجهة PSC.
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 من خلال الانتقال إلى ما يلي:
خدمات الشبكة (Network Services) → خدمة Private Service Connect → ربط الشبكة (Network Attachment) → psc-network-attachment
اختَر مشروع المستأجر (اسم المشروع الذي ينتهي بـ -tp)
يشير الحقل المميّز إلى عنوان IP الذي تستخدمه Vertex AI Pipelines من "مرفق شبكة PSC".
15. التحقّق من صحة Cloud Logging
سيستغرق تشغيل مهمة Vertex AI Pipelines للمرة الأولى 14 دقيقة تقريبًا، وستكون عمليات التشغيل اللاحقة أقصر بكثير. للتحقّق من نجاح العملية، اتّبِع الخطوات التالية:
انتقِل إلى Vertex AI → Training → Custom jobs
اختيار المهمة المخصّصة التي تم تنفيذها
اختَر "عرض السجلات".
بعد توفّر 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 تهانينا
تهانينا، لقد نجحت في إعداد واجهة Private Service Connect والتحقّق من صحتها باستخدام Vertex AI Pipelines.
لقد أنشأت البنية الأساسية للمستهلك، وأضفت مرفق شبكة سمح للمنتج بإنشاء جهاز افتراضي متعدد بطاقات واجهة شبكة (NIC) لربط الاتصال بين المستهلك والمنتج. تعرّفت على كيفية إنشاء تبادل معلومات DNS أثناء نشر خادم وكيل صريح في شبكة VPC الخاصة بالمستهلك التي سمحت بالاتصال بمثيل الجهاز الظاهري من الفئة e الذي لا يمكن توجيهه مباشرةً من Vertex.
تعتقد Cosmopup أنّ الفيديوهات التعليمية رائعة!!