1. مقدمة
واجهة Private Service Connect هي مورد يتيح لشبكة السحابة الإلكترونية الخاصة الافتراضية (VPC) الخاصة بموفّر الخدمة بدء عمليات الربط بمختلف الوجهات في شبكة المستهلك. يمكن أن تكون شبكات المنتجين والمستهلكين في مشاريع ومؤسسات مختلفة.
يشبه الاتصال بين مرفق الشبكة وواجهة Private Service Connect الاتصال بين نقطة نهاية Private Service Connect ومرفق الخدمة، ولكنّه يختلف عنه في نقطتَين أساسيتَين:
- تتيح مرفقات الشبكة لشبكة المنتج بدء الاتصالات بشبكة المستهلك (خروج الخدمة المُدارة)، بينما تتيح نقطة النهاية لشبكة المستهلك بدء الاتصالات بشبكة المنتج (دخول الخدمة المُدارة).
- اتصال واجهة Private Service Connect متعدٍّ. وهذا يعني أنّه يمكن لشبكة منتِجة التواصل مع شبكات أخرى مرتبطة بشبكة المستهلك.
ما ستنشئه
ستستفيد خدمة Vertex AI Pipelines، التي يتم نشرها في مشروع مستأجر تديره Google، من "ملحق الشبكة" في Private Service Connect لإنشاء مثيل متعدد بطاقات NIC بين شبكة المنتج وشبكة المستهلك. بما أنّ "مرفق شبكة PSC" يتم نشره باستخدام واجهة شبكة متعددة من شبكة المستهلك، يمكن أن تصل خدمة Vertex AI Pipelines إلى المسارات المتاحة من شبكة المستهلكين.
في هذا الدليل التعليمي، ستنشئ بنية شاملة لواجهة Private Service Connect (PSC) في Vertex AI Pipelines تستخدم قواعد Cloud Firewall للسماح بالاتصال أو رفضه من المنتج إلى مثيلات الاختبار الخاصة بالمستهلك، كما هو موضّح في الشكل 1.
الشكل 1

ستنشئ مرفق شبكة واحدًا خاصًا بخدمة Private Service Connect في شبكة VPC الخاصة بالمستهلك، ما يؤدي إلى حالات الاستخدام التالية:
- أنشئ قاعدة جدار حماية Ingress في consumer-vpc تسمح لشبكة Vertex AI Pipeline الفرعية (192.168.10.0/28) بالوصول إلى test-svc-1. تأكيد نجاح إنشاء PING من مهمة Pipeline إلى test-svc-1 باستخدام TCPDUMP
- أنشئ قاعدة جدار حماية Ingress في شبكة VPC الخاصة بالمستهلك تمنع الوصول إلى الشبكة الفرعية لخدمة Vertex AI Pipeline (192.168.10.0/28) من test-svc-2. تأكَّد من تعذُّر تنفيذ الأمر PING استنادًا إلى سجلّات جدار الحماية التي أنشأها "مستكشف السجلّات".
ما ستتعلمه
- كيفية إنشاء مرفق شبكة
- كيف يمكن لخدمة Vertex AI Pipelines استخدام مرفق شبكة لإنشاء واجهة PSC
- كيفية إعداد قناة تواصل من المنتِج إلى المستهلك
- كيفية السماح بالوصول من Verex AI Pipelines إلى الجهاز الافتراضي للمستهلك، test-svc-1
- كيفية رفض الوصول من Verex AI Pipelines إلى الجهاز الظاهري للمستهلك، test-svc-2 باستخدام Cloud Firewall
المتطلبات
- مشروع Google Cloud
- أذونات "إدارة الهوية وإمكانية الوصول"
- مشرف مثيل Compute (roles/compute.instanceAdmin)
- مشرف شبكة Cloud Compute (roles/compute.networkAdmin)
- مشرف أمان Compute (roles/compute.securityAdmin)
- مستخدم الاتصال النفقي المحمي بواسطة IAP (roles/iap.tunnelResourceAccessor)
- مشرف التسجيل (roles/logging.admin)
- مشرف أجهزة الكمبيوتر الدفتري (roles/notebooks.admin)
- مشرف إدارة الهوية وإمكانية الوصول في المشروع (roles/resourcemanager.projectIamAdmin)
- مشرف الحصة (roles/servicemanagement.quotaAdmin)
- مشرف حساب الخدمة (roles/iam.serviceAccountAdmin)
- مستخدم حساب الخدمة (roles/iam.serviceAccountUser)
- مشرف Vertex AI (roles/aiplatform.admin)
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 notebooks.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
3- إعداد المستهلك
إنشاء شبكة VPC للمستهلك
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
إنشاء الشبكات الفرعية للمستهلك
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks subnets create test-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks subnets create test-subnet-2 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud compute networks subnets create workbench-subnet --project=$projectid --range=192.168.40.0/28 --network=consumer-vpc --region=us-central1 --enable-private-ip-google-access
إعداد Cloud Router وNAT
يتم استخدام خدمة Cloud Network Address Translation (NAT) في البرنامج التعليمي لتنزيل حِزم برامج دفتر الملاحظات لأنّ مثيل دفتر الملاحظات لا يتضمّن عنوان IP خارجيًا. توفّر خدمة Cloud NAT إمكانات NAT للخروج، ما يعني أنّه لا يُسمح لمضيفي الإنترنت ببدء التواصل مع دفتر ملاحظات يديره المستخدم، ما يجعلها أكثر أمانًا.
داخل Cloud Shell، أنشئ موجّه السحابة الإقليمي.
gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1
داخل Cloud Shell، أنشئ بوابة NAT إقليمية على السحابة الإلكترونية.
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
إنشاء الشبكة الفرعية لـ Private Service Connect Network Attachment
في Cloud Shell، أنشئ الشبكة الفرعية Network Attachment التي تستخدمها Vertex AI Pipelines.
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
4. تفعيل Identity Aware Proxy (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، أنشئ مثيل الجهاز الافتراضي للمستهلك، test-svc-1.
gcloud compute instances create test-svc-1 \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=test-subnet-1 \
--shielded-secure-boot
داخل Cloud Shell، أنشئ مثيل الجهاز الافتراضي للمستهلك، test-svc-2.
gcloud compute instances create test-svc-2 \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=test-subnet-2 \
--shielded-secure-boot
الحصول على عناوين IP الخاصة بالأجهزة الافتراضية وتخزينها:
داخل Cloud Shell، نفِّذ عملية وصف لآلات VM الافتراضية التجريبية.
gcloud compute instances describe test-svc-1 --zone=us-central1-a | grep networkIP:
gcloud compute instances describe test-svc-2 --zone=us-central1-a | grep networkIP:
مثال:
user@cloudshell(psc-vertex)$ gcloud compute instances describe test-svc-1 --zone=us-central1-a | grep networkIP:
gcloud compute instances describe test-svc-2 --zone=us-central1-a | grep networkIP:
networkIP: 192.168.20.2
networkIP: 192.168.30.2
6. مرفق شبكة Private Service Connect
مرفقات الشبكة هي موارد إقليمية تمثّل جهة المستهلك في واجهة Private Service Connect. يمكنك ربط شبكة فرعية واحدة بمرفق شبكة، ويحدّد المنتج (Vertex AI Pipelines) عناوين IP لواجهة Private Service Connect.
إنشاء مرفق الشبكة
داخل Cloud Shell، أنشئ مرفق الشبكة.
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_MANUAL \
--subnets=intf-subnet
إدراج مرفقات الشبكة
داخل Cloud Shell، أدرِج مرفق الشبكة.
gcloud compute network-attachments list
وصف مرفقات الشبكة
داخل Cloud Shell، صف مرفق الشبكة.
gcloud compute network-attachments describe psc-network-attachment --region=us-central1
دوِّن معرّف الموارد المنتظم (URI) الخاص بـ psc-network-attachment الذي سيستخدمه المنتج عند إنشاء واجهة Private Service Connect.
في المثال أدناه، يكون معرّف الموارد المنتظم (URI) المرفق بشبكة PSC على النحو التالي:
projects/psc-vertex/regions/us-central1/networkAttachments/psc-network-attachment
user@cloudshell$ gcloud compute network-attachments describe psc-network-attachment --region=us-central1
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2025-01-21T12:25:25.385-08:00'
fingerprint: m9bHc9qnosY=
id: '56224423547354202'
kind: compute#networkAttachment
name: psc-network-attachment
network: https://www.googleapis.com/compute/v1/projects/psc-vertex/global/networks/consumer-vpc
region: https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1/networkAttachments/psc-network-attachment
subnetworks:
- https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1/subnetworks/intf-subnet
7. إعداد Vertex AI Workbench
يرشدك القسم التالي إلى كيفية إنشاء دفتر ملاحظات Jupyter. سيتم استخدام هذا الدفتر لتفعيل مهمة Pipelines Job التي ترسل PING من Vertex AI Pipelines إلى مثيلات الاختبار. يستخدم مسار البيانات بين Vertex AI Pipelines وشبكة المستهلك التي تحتوي على المثيلات واجهة شبكة Private Service Connect.
إنشاء حساب خدمة مُدار من قِبل المستخدم
في القسم التالي، ستنشئ حساب خدمة سيتم ربطه بمثيل Vertex AI Workbench المستخدَم في البرنامج التعليمي.
في البرنامج التعليمي، سيتم تطبيق الأدوار التالية على حساب الخدمة:
داخل 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، اسمح لحساب خدمة دفتر الملاحظات باستخدام حساب خدمة Compute Engine التلقائي لإنشاء مثيل لمهمة Pipeline.
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"
إنشاء مثيل Vertex AI Workbench
في القسم التالي، أنشئ مثيلاً من Vertex AI Workbench يتضمّن حساب الخدمة الذي تم إنشاؤه سابقًا، أي notebook-sa.
داخل Cloud Shell، أنشئ مثيل العميل الخاص.
gcloud workbench instances create workbench-tutorial --vm-image-project=deeplearning-platform-release --vm-image-family=common-cpu-notebooks --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=workbench-subnet --disable-public-ip --shielded-secure-boot=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com
8. Vertex AI Pipelines لاختبار إمكانية الاتصال بـ test-svc-1
افتح علامة تبويب جديدة في Cloud Shell وعدِّل إعدادات مشروعك.
داخل Cloud Shell، اتّبِع الخطوات التالية:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
للسماح بالاتصال من Vertex AI Pipelines إلى test-svc-1، أنشئ قواعد جدار حماية واردة تحدّد "ملحق شبكة PSC" كمصدر (192.168.10.0/28) وعنوان IP الخاص بـ test-svc-1 كوجهة.
داخل Cloud Shell، عدِّل destination-range ليتطابق مع عنوان IP الخاص بـ test-svc-1.
gcloud compute --project=$projectid firewall-rules create allow-icmp-vertex-pipelines-to-test-svc1-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=ALLOW --source-ranges=192.168.10.0/28 --destination-ranges=<your-test-svc-1-vm-ip> --rules=icmp
مثال:
gcloud compute --project=$projectid firewall-rules create allow-icmp-vertex-pipelines-to-test-svc1-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=ALLOW --source-ranges=192.168.10.0/28 --destination-ranges=192.168.20.2 --rules=icmp
سجِّل الدخول إلى مثيل test-svc-1 باستخدام IAP في Cloud Shell.
gcloud compute ssh test-svc-1 --project=$projectid --zone=us-central1-a --tunnel-through-iap
في نظام التشغيل، نفِّذ الأمر tcpdump لتسجيل أي زيارات icmp. سيتم استخدام جلسة نظام التشغيل هذه للتحقّق من صحة التواصل بين Vertex AI Pipeline والجهاز الافتراضي.
sudo tcpdump -i any icmp -nn
9- تعديل وكيل خدمة Vertex AI
تعمل خدمة Vertex AI Pipelines نيابةً عنك لتنفيذ عمليات، مثل الحصول على عنوان IP من الشبكة الفرعية لمرفق شبكة PSC المستخدَمة لإنشاء واجهة PSC. لإجراء ذلك، تستخدم Vertex AI Pipelines وكيل خدمة (مُدرَج أدناه) يتطلّب إذن مشرف الشبكة.
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
داخل Cloud Shell، احصل على رقم مشروعك.
gcloud projects describe $projectid | grep projectNumber
مثال:
gcloud projects describe $projectid | grep projectNumber:
projectNumber: '795057945528'
داخل Cloud Shell، عدِّل حساب وكيل الخدمة باستخدام الدور compute.networkAdmin.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-<your-projectnumber>@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
مثال:
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-795057945528@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
10. تعديل حساب الخدمة التلقائي
فعِّل Compute Engine API وامنح حساب الخدمة التلقائي إذن الوصول إلى Vertex AI. يُرجى العِلم أنّ نشر التغيير في إذن الوصول قد يستغرق بعض الوقت.
داخل Cloud Shell، عدِّل حساب الخدمة التلقائي باستخدام الدور aiplatform.user
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:<your-projectnumber>-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
مثال:
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:795057945528-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
11. Deploy Vertex AI Pipelines Job
في القسم التالي، ستنشئ دفتر ملاحظات لإجراء عملية PING ناجحة إلى مثيل consumer test-svc-1.
نفِّذ مهمة التدريب في مثيل Vertex AI Workbench.
- في Google Cloud Console، انتقِل إلى علامة التبويب "الأجهزة الافتراضية" في صفحة Vertex AI Workbench.
- بجانب اسم مثيل Vertex AI Workbench (workbench-tutorial)، انقر على "فتح JupyterLab". سيتم فتح مثيل Vertex AI Workbench في JupyterLab.
- انقر على "ملف" > "جديد" > "دفتر ملاحظات".
- اختَر Kernel > Python 3
- في خلية دفتر ملاحظات جديدة، شغِّل الأمر التالي للتأكّد من أنّ لديك أحدث إصدار من pip:
! pip3 install --upgrade --quiet google-cloud-aiplatform \
kfp \
google-cloud-pipeline-components
- ضبط متغيّرات مشروعك في خلية دفتر الملاحظات الجديدة
PROJECT_ID = "<your-projectid>"
REGION = "<your-region>"
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"
مثال:
PROJECT_ID = "psc-vertex"
REGION = "us-central1"
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"
- تحديد اسم حزمة فريد عالميًا كمتغير في خلية دفتر ملاحظات جديدة
BUCKET_URI = f"gs://<your-bucket-name>"
مثال:
BUCKET_URI = f"gs://psc-vertex-bucket"
- في خلية دفتر ملاحظات جديدة، أنشئ الحزمة
! gsutil mb -l {REGION} -p {PROJECT_ID} {BUCKET_URI}
في القسم التالي، ستحدّد حساب خدمة Compute Engine التلقائي الذي سيتم استخدامه لتشغيل مهمة خط الأنابيب، بالإضافة إلى منح الأذونات المناسبة له.
shell_output = ! gcloud projects describe $PROJECT_ID
PROJECT_NUMBER = shell_output[-1].split(":")[1].strip().replace("'", "")
SERVICE_ACCOUNT = f"{PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
print(f"Project Number: {PROJECT_NUMBER}")
print(f"Service Account: {SERVICE_ACCOUNT}")
لتأكيد نجاح التنفيذ، تتم طباعة حساب الخدمة ورقم المشروع
- في خلية دفتر ملاحظات جديدة، امنح حساب الخدمة إذن قراءة وكتابة عناصر مسار البيانات في الحزمة التي تم إنشاؤها في الخطوة السابقة.
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
- في خلية دفتر ملاحظات جديدة، حدِّد مَعلمات خط الأنابيب. يُرجى العِلم أنّ NETWORK_ATTACHMENT_NAME هو ملحق شبكة PSC، لذا يجب أن يتطابق.
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/psc_test"
NETWORK_ATTACHMENT_URI = f"projects/{PROJECT_NUMBER}/regions/{REGION}/networkAttachments/{NETWORK_ATTACHMENT_NAME}"
- في خلية دفتر ملاحظات جديدة، ابدأ حزمة تطوير البرامج (SDK) من Vertex AI
from kfp import dsl
from google.cloud import aiplatform, aiplatform_v1beta1
import time
from google.cloud.aiplatform_v1.types import pipeline_state
import yaml
from datetime import datetime
import logging
aiplatform.init(project=PROJECT_ID, location=REGION, staging_bucket=BUCKET_URI)
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
- في خلية دفتر ملاحظات جديدة، حدِّد مكوّن الاختبار
@dsl.container_component
def ping_check(network_address: str):
"""Pings a network address
Args:
network_address: The IP address to ping
"""
return dsl.ContainerSpec(
image="ubuntu:22.04",
command=["sh", "-c"],
args=[
f"""
# Use sed for regex replacement, cleaner than bash parameter expansion for this
cleaned_address=$(echo "{network_address}" | sed 's/[^0-9.]//g')
apt-get update && apt-get install inetutils-traceroute inetutils-ping -y
echo "Will ping $cleaned_address"
if ! ping -c 3 $cleaned_address; then
echo "Ping failed"
traceroute -w 1 -m 7 $cleaned_address
exit 1
fi
"""
],
)
- في خلية دفتر ملاحظات جديدة، حدِّد مسار العرض
@dsl.pipeline(name="check-connectivity")
def pipeline(ip_address: str):
"""Pings an IP address. Facilitated by a Private Service Connect Interface
Args:
ip_address: The IP address to ping
"""
ping_check(network_address=ip_address).set_caching_options(False)
return
- في خلية دفتر ملاحظات جديدة، نفِّذ دالة الأداة وانتظِر إلى أن تنتهي العملية.
def wait_for_pipeline(
project_id: str,
region: str,
pipeline_job_resource_name: str,
timeout: int = 20 * 60, # Default timeout of 20 minutes (in seconds)
) -> bool:
"""
Waits for a Vertex AI pipeline to finish, with a timeout.
Args:
project_id (str): The Google Cloud project ID.
region (str): The region where the pipeline is running.
pipeline_job_resource_name (str): The resource name of the pipeline job.
timeout (int): The maximum time to wait for the pipeline to finish, in seconds.
Defaults to 20 minutes (1200 seconds).
Returns:
bool: True if the pipeline succeeded, False otherwise.
Raises:
TimeoutError: If the pipeline does not finish within the specified timeout.
"""
# Initialize the AIPlatform client
aiplatform.init(project=project_id, location=region)
# Get the pipeline job
pipeline_job = aiplatform.PipelineJob.get(resource_name=pipeline_job_resource_name)
logging.info(
f"Vertex AI Console Link: https://console.cloud.google.com/vertex-ai/pipelines/locations/{region}/runs/{pipeline_job.resource_name.split('/')[-1]}?project={project_id}"
)
start_time = time.time()
while True:
status = pipeline_job.state
logging.info(f"Pipeline Job status: {status.name}")
if status in [
pipeline_state.PipelineState.PIPELINE_STATE_SUCCEEDED,
pipeline_state.PipelineState.PIPELINE_STATE_FAILED,
pipeline_state.PipelineState.PIPELINE_STATE_CANCELLED,
]:
break # Exit the loop if the job is finished
if time.time() - start_time > timeout:
logging.error(f"Pipeline timed out after {timeout} seconds.")
raise TimeoutError(f"Pipeline timed out after {timeout} seconds.")
# Wait for a short time before checking again
time.sleep(10) # Adjust the wait time as needed
# Do something based on the final status
if status == pipeline_state.PipelineState.PIPELINE_STATE_SUCCEEDED:
logging.info("Pipeline succeeded")
return True
elif status == pipeline_state.PipelineState.PIPELINE_STATE_CANCELLED:
logging.error("Pipeline cancelled")
raise Exception("Pipeline cancelled")
elif status == pipeline_state.PipelineState.PIPELINE_STATE_FAILED:
logging.error("Pipeline failed")
raise Exception("Pipeline failed")
- في خلية دفتر ملاحظات جديدة، نفِّذ دالة الأداة لتشغيل خط الأنابيب
def run_job_with_psc_interface_config(
project_id: str,
region: str,
pipeline_root: str,
network_attachment_name: str,
ip_address: str,
local_pipeline_file: str = "pipeline.yaml",
):
"""
Compiles, submits, and monitors a Vertex AI pipeline.
"""
parameter_values = {"ip_address": ip_address}
pipeline_root = f"{pipeline_root}/{datetime.now().strftime('%Y%m%d%H%M%S')}"
logging.info("Compiling pipeline")
try:
with open(local_pipeline_file, "r") as stream:
pipeline_spec = yaml.safe_load(stream)
logging.info(f"Pipeline Spec: {pipeline_spec}")
except yaml.YAMLError as exc:
logging.error(f"Error loading pipeline yaml file: {exc}")
raise
logging.info(f"Will use pipeline root: {pipeline_root}")
# Initialize the Vertex SDK using PROJECT_ID and LOCATION
aiplatform.init(project=project_id, location=region)
# Create the API endpoint
client_options = {"api_endpoint": f"{region}-aiplatform.googleapis.com"}
# Initialize the PipelineServiceClient
client = aiplatform_v1beta1.PipelineServiceClient(client_options=client_options)
# Construct the request
request = aiplatform_v1beta1.CreatePipelineJobRequest(
parent=f"projects/{project_id}/locations/{region}",
pipeline_job=aiplatform_v1beta1.PipelineJob(
display_name="pipeline-with-psc-interface-config",
pipeline_spec=pipeline_spec,
runtime_config=aiplatform_v1beta1.PipelineJob.RuntimeConfig(
gcs_output_directory=pipeline_root, parameter_values=parameter_values
),
psc_interface_config=aiplatform_v1beta1.PscInterfaceConfig(
network_attachment=network_attachment_name
),
),
)
# Make the API call
response = client.create_pipeline_job(request=request)
# Print the response
logging.info(f"Pipeline job created: {response.name}")
return response.name
- في خلية دفتر ملاحظات جديدة، يمكنك تجميع مسار التعلّم.
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
- في خلية دفتر ملاحظات جديدة، عدِّل TARGET_IP_ADDRESS ليعكس عنوان IP الذي تم الحصول عليه في الخطوة السابقة لـ test-svc-1 وراقِب حالة مهمة خط أنابيب المعالجة
TARGET_IP_ADDRESS = "<your-test-svc-1-ip>"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
مثال:
TARGET_IP_ADDRESS = "192.168.20.2"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
بعد تنفيذ الخطوة 17، سيستغرق إكمال عملية النقل حوالي 8 دقائق.
12. التحقّق من إمكانية الاتصال بـ test-svc-1
في الخلية المستخدَمة لتنفيذ الخطوة 17، راقِب انتقال حالة مهمة خط الأنابيب من PIPELINE_STATE_PENDING إلى PIPELINE_STATE_RUNNING ثم إلى PIPELINE_STATE_SUCCEEDED في النهاية، ما يشير إلى نجاح اختبار ping من Vertex AI Pipelines والاستجابة من test-svc-1.
للتحقّق من صحة زيارات ICMP بين Vertex AI Pipeline وtest-svc-1، اطّلِع على جلسة tcpdump التي تم إنشاؤها سابقًا والتي تم تنفيذها في نظام التشغيل test-svc-1 الذي يوفّر سجلّات تشير إلى الزيارات الثنائية الاتجاه.
في مثال tcpdump، حصلت Vertex AI Pipelines على عنوان IP 192.168.10.3 من الشبكة الفرعية 192.168.10.0/28، و192.168.20.2 هو عنوان IP الخاص بـ test-svc-1. يُرجى العِلم أنّ عناوين IP قد تختلف في بيئتك.
user@test-svc-1:~$ sudo tcpdump -i any icmp -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
18:57:54.737490 ens4 In IP 192.168.10.3 > 192.168.20.2: ICMP echo request, id 257, seq 0, length 64
18:57:54.737523 ens4 Out IP 192.168.20.2 > 192.168.10.3: ICMP echo reply, id 257, seq 0, length 64
13. إمكانية اتصال Vertex AI Pipelines بالخدمة test-svc-2
في القسم التالي، ستنشئ قاعدة جدار حماية واردة لرفض الزيارات من الشبكة الفرعية لخدمة Vertex AI Pilelines (192.168.10.0/28) إلى test-svc-2، ثم ستعدّل دفتر الملاحظات ليعكس عنوان IP الخاص بـ test-svc-2، وأخيرًا ستنفّذ عملية تشغيل "مهام البنية الأساسية".
في خلية Notebook، ستشير حالة مهمة خط الأنابيب إلى حدوث خطأ وفشل خط الأنابيب، بالإضافة إلى أنّ عمليات تسجيل جدار الحماية ستوفّر إحصاءات حول فشل الاتصال.
إنشاء قاعدة جدار حماية لرفض حركة المرور الواردة
لرفض الاتصال من Vertex AI Pipelines إلى test-svc-2، أنشئ قواعد جدار حماية واردة تحدّد "ملحق شبكة PSC" كمصدر (192.168.10.0/28) وعنوان IP الخاص بـ test-svc-2 كوجهة.
داخل Cloud Shell، عدِّل destination-range ليتطابق مع عنوان IP الخاص بـ test-svc-2.
gcloud compute --project=$projectid firewall-rules create deny-icmp-vertex-pipelines-to-test-svc2-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=DENY --source-ranges=192.168.10.0/28 --rules=ALL --destination-ranges=<your-test-svc-2-vm-ip> --rules=icmp --enable-logging
مثال:
gcloud compute --project=$projectid firewall-rules create deny-icmp-vertex-pipelines-to-test-svc2-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=DENY --source-ranges=192.168.10.0/28 --rules=ALL --destination-ranges=192.168.30.2 --enable-logging
تنفيذ مهمة مسار من خلية دفتر ملاحظات
في خلية دفتر ملاحظات جديدة، عدِّل TARGET_IP_ADDRESS ليعكس عنوان IP الذي تم الحصول عليه في الخطوة السابقة لـ test-svc-2، وراقِب حالة مهمة "خطوط الإنتاج".
TARGET_IP_ADDRESS = "<your-test-svc-2-ip>"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
مثال:
TARGET_IP_ADDRESS = "192.168.30.2"
try:
job_name = run_job_with_psc_interface_config(
project_id=PROJECT_ID,
region=REGION,
pipeline_root=PIPELINE_ROOT,
network_attachment_name=NETWORK_ATTACHMENT_URI,
ip_address=TARGET_IP_ADDRESS,
)
wait_for_pipeline(
project_id=PROJECT_ID,
region=REGION,
pipeline_job_resource_name=job_name,
)
except Exception as e:
logging.error(f"An error occurred: {e}")
بعد التنفيذ، سيستغرق إكمال مهمة سلسلة الإجراءات حوالي 8 دقائق.
14. تعذّر التحقّق من إمكانية الاتصال بـ test-svc-2
في الخلية المستخدَمة لتنفيذ مهمة Pipelines، لاحظ انتقال الحالة من PIPELINE_STATE_PENDING إلى PIPELINE_STATE_FAILED، ما يشير إلى عدم نجاح عملية اختبار الاتصال من Vertex AI Pipelines والاستجابة من test-svc-2.
باستخدام "مستكشف السجلات"، يمكنك عرض إدخالات "تسجيل جدار الحماية" التي تتطابق مع قاعدة "رفض الدخول" التي تتألف من الشبكة الفرعية Vertex AI Pipelines (192.168.10.0/28) وعنوان IP الخاص بـ test-svc-2.
انقر على "عرض طلب البحث" (Show Query) وأدرِج الفلتر أدناه، آخر 15 دقيقة (last 15 minutes) متبوعًا بـ "تنفيذ طلب البحث" (Run Query).
jsonPayload.rule_details.reference:("network:consumer-vpc/firewall:deny-icmp-vertex-pipelines-to-test-svc2-vm")


اختَر إدخالاً في السجلّ، ثم وسِّع الحقول المتداخلة لعرض عناصر المعلومات التي تتضمّن عنوان IP الخاص بـ Vertex AI Pipelines وtest-svc-2 الذي يتحقّق من صحة قاعدة جدار الحماية المرفوضة.

15. تَنظيم
من Cloud Shell، احذف مكوّنات البرنامج التعليمي.
gcloud compute instances delete test-svc-1 test-svc-2 --zone=us-central1-a --quiet
gcloud workbench instances delete workbench-tutorial --location=us-central1-a --quiet
gcloud compute firewall-rules delete deny-icmp-vertex-pipelines-to-test-svc2-vm allow-icmp-vertex-pipelines-to-test-svc1-vm ssh-iap-consumer --quiet
gcloud compute routers nats delete cloud-nat-us-central1 --router=cloud-router-us-central1 --region us-central1 --quiet
gcloud compute routers delete cloud-router-us-central1 --region=us-central1 --quiet
16. تهانينا
تهانينا، لقد تمكّنت من ضبط واجهة Private Service Connect والتحقّق من صحتها، ومن ربط المستهلك والمنتج من خلال تنفيذ جدار الحماية الذي يسمح بالدخول ويمنعه.
لقد أنشأت البنية الأساسية للمستهلك، وأضفت مرفق شبكة سمح لخدمة Vertex AI Pipelines بإنشاء واجهة الجهاز الافتراضي لخدمة PSC من أجل تسهيل التواصل بين المستهلك والمنتج. تعرّفت على كيفية إنشاء قواعد جدار الحماية في شبكة VPC الخاصة بالمستهلك والتي سمحت بالاتصال بالمثيلات في شبكة المستهلك ورفضته.
تعتقد Cosmopup أنّ الفيديوهات التعليمية رائعة!!
