1. مقدمة
واجهة Private Service Connect هي مورد يتيح لشبكة السحابة الإلكترونية الخاصة الافتراضية (VPC) الخاصة بالمنتِج بدء الاتصالات بمختلف الوجهات في شبكة السحابة الإلكترونية الخاصة الافتراضية (VPC) الخاصة بالمستهلك. يمكن أن تكون شبكات المنتجين والمستهلكين في مشاريع ومؤسسات مختلفة.
إذا قبلت أداة ربط الشبكة اتصالاً من واجهة Private Service Connect، يخصّص Google Cloud للواجهة عنوان IP من شبكة فرعية للمستهلك تحدّدها أداة ربط الشبكة. ترتبط شبكات المستهلكين والمنتجين ويمكنها التواصل باستخدام عناوين IP الداخلية.
يشبه الاتصال بين مرفق الشبكة وواجهة Private Service Connect الاتصال بين نقطة نهاية Private Service Connect ومرفق الخدمة، ولكنّه يختلف عنه في نقطتَين أساسيتَين:
- تتيح مرفقات الشبكة لشبكة المنتج بدء الاتصالات بشبكة المستهلك (خروج الخدمة المُدارة)، بينما تتيح نقطة النهاية لشبكة المستهلك بدء الاتصالات بشبكة المنتج (دخول الخدمة المُدارة).
- اتصال واجهة Private Service Connect متعدٍّ. وهذا يعني أنّه يمكن لشبكة منتِجة التواصل مع شبكات أخرى مرتبطة بشبكة المستهلك.
الشكل:1
اعتبارات إمكانية الوصول إلى واجهة PSC في Vertex AI
- يمكن لواجهة Vertex AI PSC توجيه الزيارات إلى وجهات في سحابة VPC أو في الموقع الجغرافي ضمن حظر عناوين RFC1918.
- يتطلّب استهداف واجهة PSC لكتل العناوين غير RFC-1918 نشر خادم وكيل صريح في شبكة VPC الخاصة بالمستهلك مع عنوان RFC-1918. في عملية نشر Vertex AI، يجب تحديد الخادم الوكيل مع اسم نطاق مؤهَّل بالكامل لنقطة النهاية المستهدَفة. راجِع الشكل 1 الذي يمثّل وضع الخادم الوكيل الصريح Secure Web proxy (SWP) الذي تم ضبطه في شبكة VPC الخاصة بالمستهلك لتسهيل التوجيه إلى نطاقات CIDR التالية غير RFC-1918:
- 240.0.0.0/4
- 203.0.113.0/24
- لا يلزم استخدام خادم وكيل للعنوان 10.10.20.0/28، فهو يندرج ضمن نطاق RFC-1918.
- حركة البيانات الصادرة من الإنترنت
الاتصال بالإنترنت لشبكة المستأجر المُدارة من Google:
واجهة PSC في Vertex AI بدون عناصر تحكّم خدمة VPC
- عند ضبط عملية النشر باستخدام واجهة PSC فقط، سيتم الاحتفاظ بإمكانية الوصول التلقائية إلى الإنترنت. تخرج هذه الزيارات الصادرة مباشرةً من شبكة المستأجر التي تديرها Google.
واجهة PSC في Vertex AI مع عناصر تحكّم خدمة VPC
- عندما يكون مشروعك جزءًا من حدود "عناصر التحكّم في خدمة السحابة الإلكترونية الافتراضية الخاصة"، يتم حظر وصول المستأجر الذي تديره Google تلقائيًا إلى الإنترنت من خلال الحدود لمنع استخراج البيانات.
- للسماح بالوصول إلى الإنترنت العام في هذا السيناريو، يجب ضبط مسار خروج آمن يوجّه حركة البيانات من خلال شبكة VPC المرتبطة بخدمة Vertex AI. يمكن تحقيق ذلك من خلال نشر خادم وكيل داخل شبكة السحابة الإلكترونية الخاصة الافتراضية (VPC) باستخدام عنوان RFC 1918، مع إقرانه ببوابة Cloud NAT. يُرجى العِلم أنّه يمكنك أيضًا استخدام خادم وكيل Secure Web لإعادة توجيه حركة البيانات إلى الإنترنت. يؤدي إنشاء Secure Web Proxy إلى إنشاء بوابة Cloud NAT تلقائيًا.
لمزيد من المعلومات، يُرجى الاطّلاع على المراجع التالية:
إعداد واجهة Private Service Connect لموارد Vertex AI | Google Cloud
ما ستنشئه
في هذا الدليل التعليمي، ستنشئ عملية نشر شاملة لخدمة Vertex AI Pipelines باستخدام واجهة Private Service Connect (PSC) للسماح بالاتصال من المنتج إلى موارد الحوسبة الخاصة بالمستهلك كما هو موضّح في الشكل 1 الذي يستهدف نقطة نهاية غير RFC 1918 في class-e-subnet.
الشكل 2
ستنشئ psc-network-attachment واحدًا في شبكة VPC الخاصة بالمستهلك باستخدام تبادل معلومات بين الشبكات عبر نظام أسماء النطاقات (DNS) لتحويل الأجهزة الافتراضية الخاصة بالمستهلكين في مشروع المستأجر الذي يستضيف Vertex AI Training، ما يؤدي إلى حالات الاستخدام التالية:
يمكنك نشر Vertex AI Pipelines وضبط Secure Web Proxy في وضع الخادم الوكيل الصريح، ما يسمح له بتنفيذ wget على جهاز افتراضي في الشبكة الفرعية من الفئة E.
ما ستتعلمه
- كيفية إنشاء مرفق شبكة
- كيف يمكن للمنتج استخدام مرفق شبكة لإنشاء واجهة PSC؟
- كيفية إنشاء تبادل معلومات بين الشبكات عبر نظام أسماء النطاقات (DNS) لتحويل النطاقات الخاصة التي تم إعدادها في شبكة VPC الخاصة بالمستهلك من شبكات VPC المُدارة من Google
- كيفية إعادة توجيه حركة البيانات من واجهة Vertex AI PSC إلى Secure Web Proxy
- كيفية إنشاء اتصال بمساحة عنوان IP غير RFC-1918 من Vertex AI Pipelines
المتطلبات
مشروع Google Cloud
أذونات "إدارة الهوية وإمكانية الوصول"
- مشرف شبكة Cloud Compute (roles/compute.networkAdmin)
- مشرف مثيل Compute (roles/compute.instanceAdmin)
- مشرف أمان Compute (roles/compute.securityAdmin)
- مشرف سياسة الأمان(roles/compute.orgSecurityPolicyAdmin)
- مشرف نظام أسماء النطاقات (roles/dns.admin)
- مستخدم الاتصال النفقي المحمي بواسطة IAP (roles/iap.tunnelResourceAccessor)
- مشرف تسجيل الدخول (roles/logging.admin)
- مشرف أجهزة الكمبيوتر الدفتري (roles/notebooks.admin)
- مشرف إدارة الهوية وإمكانية الوصول في المشروع (roles/resourcemanager.projectIamAdmin)
- مشرف حساب الخدمة (roles/iam.serviceAccountAdmin)
- مستخدِم حساب الخدمة (roles/iam.serviceAccountUser)
- مشرف استخدام الخدمة (roles/serviceusage.serviceUsageAdmin)
2. قبل البدء
تعديل المشروع ليتوافق مع البرنامج التعليمي
يستخدِم هذا البرنامج التعليمي $variables للمساعدة في تنفيذ عملية إعداد gcloud في Cloud Shell.
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
projectid=YOUR-PROJECT-ID
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"
gcloud services enable "networkservices.googleapis.com"
gcloud services enable "networksecurity.googleapis.com"
gcloud services enable "certificatemanager.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 --enable-private-ip-google-access
إنشاء الشبكة الفرعية التي تستخدم الخادم الوكيل فقط
gcloud compute networks subnets create proxy-only-uscentral1 \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=us-central1 \
--network=consumer-vpc \
--range=10.10.100.0/26
إنشاء الشبكة الفرعية لـ Private Service Connect 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 \
--enable-private-ip-google-access
إعداد Cloud Router وNAT
يوفّر "الخادم الوكيل الآمن للويب" في Google Cloud ويدير تلقائيًا بوابة Cloud NAT وجهاز توجيه Cloud Router مرتبطًا في المنطقة التي يتم نشره فيها.
4. تفعيل عمليات الشراء داخل التطبيق
للسماح لخدمة IAP (الخادم الوكيل المدرك للهوية) بالاتصال بأجهزة 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 \
--private-network-ip=240.0.0.2
6. الخادم الوكيل الآمن للويب
"الوضع الصريح" (أو "وضع توجيه الخادم الوكيل الصريح") في Secure Web Proxy هو طريقة نشر يجب فيها ضبط أحمال عمل العميل بشكل صريح لاستخدام عنوان IP الداخلي أو اسم النطاق المؤهَّل بالكامل والمنفذ في SWP كخادم وكيل لإعادة التوجيه.
في الخطوات أدناه، احرص على تعديل YOUR-PROJECT-ID إلى رقم تعريف مشروعك.
إنشاء خادم وكيل للويب:
في Cloud Shell، أنشئ الملف policy.yaml باستخدام محرِّر نصوص:
cat > policy.yaml << EOF
description: basic Secure Web Proxy policy
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
EOF
في Cloud Shell، أنشئ سياسة Secure Web Proxy:
gcloud network-security gateway-security-policies import policy1 \
--source=policy.yaml \
--location=us-central1
في القسم التالي، أنشئ قاعدة للسماح بالوصول إلى class-e-vm استنادًا إلى المضيف sessionMatcher.
في Cloud Shell، أنشئ الملف rule1.yaml باستخدام محرِّر نصوص:
cat > rule1.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-nonrfc-classe
description: Allow nonrfc class-e
enabled: true
priority: 1
basicProfile: ALLOW
sessionMatcher: host() == 'class-e-vm.demo.com'
EOF
في القسم التالي، أنشئ قاعدة للسماح لوحدة Jupyter Notebook بالوصول إلى الجهاز الظاهري "class-e" للسماح بتثبيت apache2 عليه.
في Cloud Shell، أنشئ الملف rule2.yaml باستخدام محرِّر نصوص:
cat > rule2.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-apache2
description: Allow Apache2 install on class-e VM
enabled: true
priority: 2
basicProfile: ALLOW
sessionMatcher: inIpRange(source.ip,'240.0.0.2')
EOF
في Cloud Shell، أنشئ قاعدة سياسة الأمان 1:
gcloud network-security gateway-security-policies rules import allow-nonrfc-classe \
--source=rule1.yaml \
--location=us-central1 \
--gateway-security-policy=policy1
في Cloud Shell، أنشئ قاعدة سياسة الأمان 2:
gcloud network-security gateway-security-policies rules import allow-apache2 \
--source=rule2.yaml \
--location=us-central1 \
--gateway-security-policy=policy1
لإتاحة استخدام Vertex AI Training، اضبط إعدادات بوابة Secure Web Proxy على ما يلي:
- منفذ الاستماع: استخدِم المنفذ نفسه الذي تم ضبطه في إعدادات الخادم الوكيل الصريحة لرمز تطبيق Vertex AI (مثل 8080).
- العنوان: خصِّص عنوان IP خاصًا من نطاق RFC 1918.
- وضع التوجيه: اضبط هذا الخيار على EXPLICIT_ROUTING_MODE
في Cloud Shell، أنشئ ملف gateway.yaml لتحديد بوابة Secure Web Proxy:
cat > gateway.yaml << EOF
name: projects/$projectid/locations/us-central1/gateways/swp1
type: SECURE_WEB_GATEWAY
addresses: ["10.10.10.5"]
ports: [8080]
gatewaySecurityPolicy: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
network: projects/$projectid/global/networks/consumer-vpc
subnetwork: projects/$projectid/regions/us-central1/subnetworks/rfc1918-subnet1
routingMode: EXPLICIT_ROUTING_MODE
EOF
في Cloud Shell، أنشئ مثيل Secure Web Proxy:
gcloud network-services gateways import swp1 \
--source=gateway.yaml \
--location=us-central1
قد يستغرق نشر Secure Web Proxy عدة دقائق.

7. مرفق شبكة 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_MANUAL \
--subnets=intf-subnet
ملاحظة: ليس عليك الإشارة صراحةً إلى رقم تعريف المشروع المقبول في هذا المرفق، فعند إعداد Vertex AI، ستتم إضافة مشروع المستأجر المُدار من Google تلقائيًا كما لو تم إعداده على "قبول تلقائيًا".
إدراج مرفقات الشبكة
داخل Cloud Shell، أدرِج مرفق الشبكة.
gcloud compute network-attachments list
وصف مرفقات الشبكة
داخل Cloud Shell، صف مرفق الشبكة.
gcloud compute network-attachments describe psc-network-attachment --region=us-central1
دوِّن اسم مرفق شبكة PSC، psc-network-attachment، الذي سيستخدمه المنتِج عند إنشاء واجهة Private Service Connect.
لعرض عنوان URL لملف PSC Network Attachment في Cloud Console، انتقِل إلى ما يلي:
خدمات الشبكة (Network Services) → خدمة Private Service Connect (Private Service Connect) → ربط الشبكة (Network Attachment) → psc-network-attachment

8. منطقة نظام أسماء النطاقات الخاص
ستنشئ منطقة 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، أنشئ مجموعة السجلات للجهاز الافتراضي، 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، أنشئ مجموعة السجلات الخاصة بخادم Secure Web Proxy، وتأكَّد من تعديل عنوان IP استنادًا إلى ناتج بيئتك.
gcloud dns --project=$projectid record-sets create explicit-swp.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.5"
إنشاء قاعدة في "جدار حماية السحابة الإلكترونية" للسماح بالوصول من واجهة PSC
في القسم التالي، أنشئ قاعدة جدار حماية تسمح للزيارات الواردة من PSC Network Attachment بالوصول إلى موارد الحوسبة RFC 1918 في شبكة VPC الخاصة بالمستهلكين.
في Cloud Shell، أنشئ قاعدة جدار الحماية التي تتيح الدخول والتي تسمح بالوصول من الشبكة الفرعية للخادم الوكيل فقط إلى الشبكة الفرعية من الفئة e. لأنّ عملية محو بيانات الخدمة (SWP) تبدأ الاتصال بشبكة فرعية للخادم الوكيل فقط كعنوان مصدر.
gcloud compute firewall-rules create allow-access-to-class-e \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="10.10.100.0/28" \
--destination-ranges="240.0.0.0/4" \
--enable-logging
9- إنشاء دفتر ملاحظات Jupyter
يرشدك القسم التالي إلى كيفية إنشاء دفتر ملاحظات 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"
عدِّل حساب الخدمة باستخدام دور "مشرف مساحة التخزين".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
عدِّل حساب الخدمة باستخدام دور "مستخدم AI Platform".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
عدِّل حساب الخدمة باستخدام دور "مشرف Artifact Registry".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
عدِّل حساب الخدمة باستخدام دور "محرِّر Cloud Build".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
السماح لحساب خدمة دفتر الملاحظات باستخدام حساب خدمة 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
ملاحظة: قبل تعديل أذونات وكيل الخدمة، انتقِل إلى Vertex AI في Cloud Console للتأكّد من تفعيل واجهة Vertex AI API.
داخل Cloud Shell:
احصل على رقم مشروعك.
gcloud projects describe $projectid | grep projectNumber
اضبط رقم مشروعك.
projectnumber=YOUR-PROJECT-NUMBER
أنشئ حساب خدمة لمنصة AI Platform. تخطَّ هذه الخطوة إذا كان لديك حساب خدمة حالي في مشروعك.
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
عدِّل حساب وكيل الخدمة باستخدام الدور compute.networkAdmin.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
تعديل حساب وكيل الخدمة باستخدام الدور 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"
تعديل حساب الخدمة التلقائي باستخدام الدور storage.admin
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
تعديل حساب الخدمة التلقائي باستخدام الدور artifactregistry.admin
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. ثبِّت Apache2 وفعِّل Tcpdump على "class-e-vm":
من class-e-vm، ثبِّت apache2 من خلال الخادم الوكيل الآمن للويب باتّباع الخطوات التالية:
افتح علامة تبويب Cloud Shell جديدة، وعدِّل متغيّر مشروعك، ثم سجِّل الدخول إلى class-e-vm باستخدام ssh.
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" update
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" install apache2 -y
sudo service apache2 restart
echo 'class-e Server !!' | sudo tee /var/www/html/index.html
نفِّذ عملية tcpdump الفلترة على الشبكة الفرعية التي تستخدم الخادم الوكيل فقط، والتي يستخدمها Secure Web Proxy لإعادة توجيه عدد الزيارات إلى الأهداف.
من الفئة e-vm OS، نفِّذ فلترة tcpdump على الشبكة الفرعية proxy-vm.
sudo tcpdump -i any net 10.10.100.0/24 -nn
ملاحظة: تأكَّد من تفعيل "الوصول الخاص إلى Google" على الشبكة الفرعية لنموذج البرنامج التعليمي الخاص ببيئة العمل كي يتم فتح "جلسة JupyterLab".
13. نشر مهمة Vertex AI Pipelines
في القسم التالي، ستنشئ دفتر ملاحظات لإجراء عملية 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، أنشئ خلية جديدة وعدِّلها وشغِّلها على النحو التالي. احرص على تعديل 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://explicit-swp.demo.com:8080"
- يرتبط اسم 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 nonRFC-1918 API and saves the response.
Args:
url: The URL of the API to send the request to.
"""
import requests
try:
# response = requests.get(url)
proxy_server = f"http://explicit-swp.demo.com:8080" # replace it with your Secure Web proxy Ip-address and the port.
proxies = {
"http": proxy_server,
"https": proxy_server,
}
response = requests.get(url, proxies=proxies)
logging.info(response.text)
response.raise_for_status() # Raise an exception for bad status codes
logging.info(f"Successfully fetched data from {url}")
except requests.exceptions.RequestException as e:
logging.error(f"An error occurred: {e}")
raise e
if __name__ == '__main__':
# Configure logging to print clearly to the console
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s',
stream=sys.stdout
)
url_to_test = os.environ['NONRFC_URL']
proxy_vm_ip = os.environ['PROXY_VM_IP']
proxy_vm_port = os.environ['PROXY_VM_PORT']
logging.info(f"url_to_test: {url_to_test}")
logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
logging.info(f"proxy_vm_port: {proxy_vm_port}")
make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)
في دفتر JupyterLab، أنشئ خلية جديدة وشغِّل ما يلي.
%%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.
- في هذه الحالة، يكون وكيل الويب في وضع التوجيه الصريح هو explicit-swp.demo.com. تتم معالجة التحويل من خلال ربط نظام أسماء النطاقات (DNS) داخل شبكة VPC الخاصة بالمستهلك.
- المنفذ 8080 هو منفذ الاستماع (تلقائي) الذي تم إعداده في الخادم الوكيل الآمن للويب
- يتم التحويل من
wgetإلى class-e-vm-demo.com من خلال تبادل معلومات بين الشبكات لنظام أسماء النطاقات - يحدّد الرمز "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 = "explicit-swp.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8080" #@param {type:"string"}
CUSTOM_JOB = {
"display_name": JOB_ID,
"job_spec": {
"worker_pool_specs": [
{
"machine_spec": {
"machine_type": "n1-standard-4",
},
"replica_count": 1,
"container_spec": {
"image_uri": IMAGE_URI,
"env": [{
"name": "NONRFC_URL",
"value": NON_RFC_URL
},
{
"name": "PROXY_VM_IP",
"value": PROXY_VM_IP
},
{
"name": "PROXY_VM_PORT",
"value": PROXY_VM_PORT
}]
},
},
],
"enable_web_access": True,
"psc_interface_config": {
"network_attachment": "psc-network-attachment",
"dns_peering_configs": [
{
"domain": "demo.com.",
"target_project": PROJECT_ID,
"target_network": "consumer-vpc"
},
]
},
}
}
print(json.dumps(CUSTOM_JOB, indent=2))
في دفتر JupyterLab، أنشئ خلية جديدة وشغِّل ما يلي.
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 (Private Service Connect) → ربط الشبكة (Network Attachment) → psc-network-attachment
اختَر مشروع المستأجر (اسم المشروع الذي ينتهي بـ -tp)

يشير الحقل المميّز إلى عنوان IP الذي تستخدمه Vertex AI Pipelines من "مرفق شبكة" في PSC.

15. التحقّق من صحة Cloud Logging
ستستغرق مهمة Vertex AI Pipelines حوالي 14 دقيقة لتنفيذها للمرة الأولى، وستكون عمليات التنفيذ اللاحقة أقصر بكثير. للتأكّد من نجاح العملية، اتّبِع الخطوات التالية:
انتقِل إلى Vertex AI → التدريب → المهام المخصّصة
اختيار المهمة المخصّصة التي تم تنفيذها

اختَر "عرض السجلات".

بعد توفّر Cloud Logging، اختَر "تنفيذ طلب بحث" الذي ينشئ التحديد المميّز أدناه والذي يؤكّد عملية wget ناجحة من Vertex AI Pipelines إلى class-e-vm.


16. التحقّق من صحة TCPDump
لنراجع ناتج TCPDUMP الذي يثبت صحة الاتصال بمثيلات الحوسبة:
من class-e-vm، راقِب طلب HTTP GET و200 OK
XXXXXXXXX@class-e-vm:~$ sudo tcpdump -i any net 10.10.100.0/28 -nn tcpdump: data link type LINUX_SLL2 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 05:51:14.173641 ens4 In IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [S], seq 1747181041, win 65535, options [mss 1420,sackOK,TS val 3942828403 ecr 0,nop,wscale 8], length 0 05:51:14.173668 ens4 Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [S.], seq 3013226100, ack 1747181042, win 64768, options [mss 1420,sackOK,TS val 1886125065 ecr 3942828403,nop,wscale 7], length 0 05:51:14.174977 ens4 In IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [.], ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 0 05:51:14.175066 ens4 In IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [P.], seq 1:223, ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 222: HTTP: GET / HTTP/1.1 05:51:14.175096 ens4 Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [.], ack 223, win 505, options [nop,nop,TS val 1886125066 ecr 3942828405], length 0 05:51:14.239042 ens4 Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [P.], seq 1:246, ack 223, win 505, options [nop,nop,TS val 1886125130 ecr 3942828405], length 245: HTTP: HTTP/1.1 200 OK
17. تَنظيم
من Cloud Shell، احذف مكوّنات البرنامج التعليمي.
gcloud workbench instances delete workbench-tutorial --project=$projectid --location=us-central1-a
gcloud network-security gateway-security-policies rules delete allow-nonrfc-classe \
--gateway-security-policy=policy1 \
--location=us-central1
gcloud network-security gateway-security-policies rules delete allow-apache2 \
--gateway-security-policy=policy1 \
--location=us-central1
gcloud network-security gateway-security-policies delete policy1 \
--location=us-central1
gcloud network-services gateways delete swp1 \
--location=us-central1
gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet
gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet
gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns record-sets delete explicit-swp.demo.com --zone=private-dns-codelab --type=A
gcloud dns managed-zones delete private-dns-codelab
gcloud computeinstances delete class-e-vm --project=$projectid --zone=us-central1-a --quiet
gcloud compute networks delete consumer-vpc --quiet
18 تهانينا
تهانينا، لقد نجحت في إعداد اتصال والتحقّق من صحته بين واجهة Private Service Connect لخدمة Vertex AI Pipelines ونطاقات IP غير RFC من خلال Secure Web Proxy.
لقد أنشأت البنية الأساسية للمستهلك، وأضفت مرفق شبكة سمح للمنتج بإنشاء جهاز افتراضي متعدد بطاقات NIC لربط الاتصال بين المستهلك والمنتج. تعرّفت على كيفية إنشاء تبادل معلومات DNS أثناء نشر خادم وكيل صريح في شبكة VPC الخاصة بالمستهلك والتي سمحت بالاتصال بمثيل class-e-vm الذي لا يمكن توجيهه مباشرةً من Vertex.

ما هي الخطوات التالية؟
مزيد من المعلومات والفيديوهات
المستندات المرجعية
- نظرة عامة على إذن الوصول إلى الشبكة في Vertex AI | Google Cloud
- لمحة عن الوصول إلى خدمات Vertex AI من خلال واجهات Private Service Connect | Google Cloud
- استخدام واجهة Private Service Connect لخدمة Vertex AI Training | Google Cloud
- إعداد واجهة Private Service Connect لموارد Vertex AI | Google Cloud
- يمكنك أيضًا ربط حساب خدمة بعنوان المضيف أو عنوان IP وما إلى ذلك لإعادة توجيه حركة البيانات إلى SWP في وضع التوجيه الصريح. يُرجى اتّباع مستند لغة التعبير الشائعة (CEL) للاطّلاع على المزيد من الأمثلة.