1. مقدمة
واجهة Private Service Connect هي مورد يتيح لشبكة سحابة إلكترونية خاصة افتراضية (VPC) للمنتج بدء عمليات الربط بوجهات مختلفة في شبكة المستهلك. يمكن أن تكون شبكات المنتجين والمستهلكين في مشاريع ومؤسسات مختلفة.
يشبه الاتصال بين مرفق الشبكة وواجهة Private Service Connect الاتصال بين نقطة نهاية Private Service Connect ومرفق الخدمة، ولكن هناك اختلافان رئيسيان بينهما:
- تسمح إضافة الشبكة لشبكة المنتج ببدء عمليات الربط بشبكة المستهلِك (مغادرة الخدمة المُدارة)، في حين تسمح نقطة النهاية لشبكة المستهلِك ببدء عمليات الربط بشبكة المنتج (دخول الخدمة المُدارة).
- يكون اتصال واجهة Private Service Connect انتقاليًا. وهذا يعني أنّ شبكة المنتجين يمكنها التواصل مع الشبكات الأخرى المتصلة بشبكة المستهلكين.
ما ستُنشئه
ستستفيد مسارات Vertex AI قيد النشر في مشروع مستأجر مُدار من Google من "إرفاق شبكة PSC" لإنشاء مثيل متعدد بطاقات NIC بين شبكة المنتج والمستهلك. بما أنّه يتمّ نشر "مرفق شبكة مزوّد بوحدة تحكّم في شبكة متعددة" باستخدام وحدة تحكّم في شبكة متعددة من شبكة المستهلكين، يمكن لـ "مسارات Vertex AI" الوصول إلى المسارات المتاحة من شبكة المستهلكين.
في هذا الدليل التعليمي، ستُنشئ بنية شاملة لواجهة Private Service Connect (PSC) لمسار Vertex AI Pipeline التي تستخدِم قواعد Cloud Firewall للسماح بالاتصال من المنتج إلى النُسخ الاختبارية للمستهلك أو رفضه، كما هو موضّح في الشكل 1.
الشكل 1
ستنشئ عنصرًا واحدًا من psc-network-attachment في شبكة VPC للمستهلك، ما يؤدي إلى حالات الاستخدام التالية:
- أنشئ قاعدة جدار حماية للدخول في consumer-vpc تسمح للشبكة الفرعية لقناة Vertex AI Pipeline (192.168.10.0/28) بالوصول إلى test-svc-1. تأكيد نجاح PING الذي تم إنشاؤه من وظيفة Pipeline إلى test-svc-1 باستخدام TCPDUMP
- أنشئ قاعدة جدار حماية للدخول في consumer-vpc تمنع شبكة Vertex AI Pipeline الفرعية (192.168.10.0/28) من الوصول إلى test-svc-2. تأكَّد من تعذُّر استخدام الأمر PING استنادًا إلى سجلات جدار الحماية التي أنشأها Log Explorer.
ما ستتعرّف عليه
- كيفية إنشاء مرفق شبكة
- كيفية استخدام مسارات Vertex AI لواجهة شبكة لإنشاء واجهة PSC
- كيفية التواصل من المنتج إلى المستهلك
- كيفية السماح بالوصول من Verex AI Pipelines إلى الجهاز الافتراضي للمستهلك test-svc-1
- كيفية رفض الوصول من Verex AI Pipelines إلى الجهاز الافتراضي للمستهلك test-svc-2 باستخدام Cloud Firewall
المتطلبات
- مشروع Google Cloud
- أذونات إدارة الهوية وإمكانية الوصول
- مشرف مثال Cloud Compute (roles/compute.instanceAdmin)
- مشرف شبكة Cloud Compute (roles/compute.networkAdmin)
- مشرف أمان Compute (roles/compute.securityAdmin)
- مستخدم النفق الآمن عبر "إدارة الهوية وإمكانية الوصول" (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
يتم استخدام ميزة "ترجمة عناوين الشبكة" (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
داخل Cloud Shell، أنشئ شبكة فرعية لـ "مرفق الشبكة" تستخدمها مسارات Vertex AI.
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)
للسماح لميزة "الشراء داخل التطبيق" بالاتصال بمثيلات الأجهزة الافتراضية، أنشئ قاعدة جدار حماية تستوفي الشروط التالية:
- ينطبق على جميع مثيلات الأجهزة الافتراضية التي تريد الوصول إليها باستخدام ميزة "الشراء داخل التطبيق".
- السماح بدخول الزيارات من نطاق 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، نفِّذ الأمر describe مع مثيلات الأجهزة الافتراضية الاختبارية.
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) عناوين 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
دوِّن معرّف الموارد المنتظم psc-network-attachment الذي سيستخدمه المنتج عند إنشاء واجهة Private Service Connect.
في المثال أدناه، عنوان URL المرفق بشبكة 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. سيتم استخدام دفتر البيانات هذا لنشر مهمة "مسارات البيانات" التي تُرسِل رسالة PING من مسار بيانات Vertex AI إلى النُسخ التجريبية. يستخدم مسار البيانات بين مسارات Vertex AI وشبكة المستهلك التي تحتوي على النُسخ المثيل واجهة شبكة 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، عدِّل حساب الخدمة باستخدام دور "مشرف سجلّ العناصر".
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
داخل 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"
إنشاء مثيل 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 إلى test-svc-1، أنشئ قواعد جدار حماية للدخول تحدد مرفق شبكة PSC كمصدر (192.168.10.0/28) وعنوان IP الخاص بخدمة test-svc-1 كوجهة.
في Cloud Shell، عدِّل النطاق المقصود ليطابق عنوان 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. نشر مهمة Vertex AI Pipelines
في القسم التالي، ستنشئ دفتر ملاحظات لإجراء عملية PING ناجحة لوحدة المستهلك test-svc-1.
شغِّل وظيفة التدريب في مثيل Vertex AI Workbench.
- في وحدة تحكّم Google Cloud، انتقِل إلى علامة التبويب "النُسخ" في صفحة Vertex AI Workbench.
- بجانب اسم مثيل Vertex AI Workbench (workbench-tutorial)، انقر على Open JupyterLab (فتح JupyterLab). يتم فتح نسخة Vertex AI Workbench في JupyterLab.
- اختَر ملف > جديد > دفتر ملاحظات.
- اختَر "النواة" > 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، ما يشير إلى نجاح إرسال طلب فحص الاتصال من مسار الإحالة الناجحة في Vertex AI والاستجابة من test-svc-1.
للتحقّق من صحة حركة بيانات ICMP بين مسار Vertex AI وtest-svc-1، اطّلِع على جلسة tcpdump التي تم إنشاؤها سابقًا والتي تم تنفيذها في نظام التشغيل test-svc-1 الذي يقدّم سجلات تشير إلى حركة البيانات في الاتجاهين.
في مثال tcpdump، حصلت Vertex AI Pipelines على عنوان IP 192.168.10.3 من الشبكة الفرعية 192.168.10.0/28، وعنوان IP 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 AI to test-svc-2 connectivity
في القسم التالي، ستنشئ قاعدة جدار حماية للدخول لرفض الزيارات من شبكة Vertex AI Pilelines الفرعية (192.168.10.0/28) إلى test-svc-2، ثم تعديل دفتر البيانات ليعكس عنوان IP الخاص بـ test-svc-2، ثم تنفيذ عمليات تشغيل Pipelines أخيرًا.
في خلية "دفتر الملاحظات"، ستشير حالة "مخطّط المعالجة" إلى الخطأ "تعذّر إكمال خطّة المعالجة"، بالإضافة إلى أنّ سجلّات جدار الحماية ستوفّر إحصاءات عن الاتصال الذي تعذّر إكماله.
إنشاء قاعدة جدار حماية لرفض الإذن بالوصول
لرفض الاتصال من مسارات Vertex AI إلى test-svc-2، أنشئ قواعد جدار حماية للدخول تحدد "مرفق شبكة PSC" كمصدر (192.168.10.0/28) وعنوان IP الخاص بخدمة test-svc-2 كوجهة.
في Cloud Shell، عدِّل نطاق الوجهة ليطابق عنوان 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
في الخلية المستخدَمة لتنفيذ مهمة "مسارات البيانات"، لاحِظ انتقال الحالة من PIPELINE_STATE_PENDING إلى PIPELINE_STATE_FAILED، ما يشير إلى عدم نجاح طلب تأكيد الاتصال من مسارات Vertex AI للبيانات والاستجابة من test-svc-2.
باستخدام "مستكشف السجلات"، يمكنك عرض إدخالات "تسجيل جدار الحماية" التي تتطابق مع قاعدة "رفض الدخول" التي تتألف من الشبكة الفرعية لـ Vertex AI Pipelines (192.168.10.0/28) وعنوان IP test-svc-2.
اختَر "عرض الطلب" وأدخِل الفلتر أدناه، "آخر 15 دقيقة"، ثمّ انقر على "تنفيذ الطلب".
jsonPayload.rule_details.reference:("network:consumer-vpc/firewall:deny-icmp-vertex-pipelines-to-test-svc2-vm")
اختَر إدخال سجلّ متبوعًا بتوسيع الحقول المُدمجة للكشف عن عناصر المعلومات التي تتألف من مسارات Vertex AI وعنوان IP 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 أنّ الأدلة التعليمية رائعة.