خدمات خصوصی اتصال رابط Vertex AI Pipelines

۱. مقدمه

رابط اتصال سرویس خصوصی منبعی است که به یک شبکه ابر خصوصی مجازی (VPC) تولیدکننده اجازه می‌دهد تا اتصالاتی را با مقاصد مختلف در یک شبکه مصرف‌کننده آغاز کند. شبکه‌های تولیدکننده و مصرف‌کننده می‌توانند در پروژه‌ها و سازمان‌های مختلف باشند.

اتصال بین یک اتصال شبکه و یک رابط Private Service Connect مشابه اتصال بین یک نقطه پایانی Private Service Connect و یک اتصال سرویس است، اما دو تفاوت کلیدی دارد:

  • یک اتصال شبکه به شبکه تولیدکننده اجازه می‌دهد تا اتصالاتی را به شبکه مصرف‌کننده آغاز کند (خروجی سرویس مدیریت‌شده)، در حالی که یک نقطه پایانی به شبکه مصرف‌کننده اجازه می‌دهد تا اتصالاتی را به شبکه تولیدکننده آغاز کند (ورودی سرویس مدیریت‌شده).
  • اتصال رابط Private Service Connect از نوع انتقالی است. این بدان معناست که یک شبکه تولیدکننده می‌تواند با شبکه‌های دیگری که به شبکه مصرف‌کننده متصل هستند، ارتباط برقرار کند.

آنچه خواهید ساخت

Vertex AI Pipelines که در یک پروژه مستاجر تحت مدیریت گوگل مستقر شده است، از PSC Network Attachment برای ایجاد یک نمونه چند کارتی بین شبکه تولیدکننده و مصرف‌کننده استفاده خواهد کرد. از آنجایی که PSC Network Attachment با یک چند کارتی از شبکه مصرف‌کننده مستقر شده است، Vertex AI Pipelines می‌تواند به مسیرهای موجود از شبکه مصرف‌کنندگان دسترسی پیدا کند.

در این آموزش، شما قصد دارید یک معماری جامع رابط کاربری Private Service Connect (PSC) برای Vertex AI Pipelines بسازید که از قوانین Cloud Firewall برای اجازه دادن یا ندادن اتصال از تولیدکننده به نمونه‌های آزمایشی مصرف‌کننده، همانطور که در شکل 1 نشان داده شده است، استفاده می‌کند.

شکل ۱

۱۲۷۱۴b6f0f8fa411.png

شما یک psc-network-attachment واحد در VPC مصرف‌کننده ایجاد خواهید کرد که منجر به موارد استفاده زیر می‌شود:

  1. یک قانون فایروال Ingress در consumer-vpc ایجاد کنید که به زیرشبکه Vertex AI Pipeline (192.168.10.0/28) اجازه می‌دهد تا test-svc-1 را انجام دهد. با استفاده از TCPDUMP، پینگ موفق ایجاد شده از Pipeline Job به test-svc-1 را تأیید کنید.
  2. یک قانون فایروال Ingress در زیرشبکه‌ی 192.168.10.0/28 مربوط به consumer-vpc که Vertex AI Pipeline را رد می‌کند، برای test-svc-2 ایجاد کنید. بر اساس گزارش‌های فایروال تولید شده توسط Log Explorer، عدم موفقیت PING را تأیید کنید.

آنچه یاد خواهید گرفت

  • نحوه ایجاد پیوست شبکه
  • چگونه Vertex AI Pipelines می‌تواند از یک اتصال شبکه برای ایجاد رابط PSC استفاده کند
  • نحوه برقراری ارتباط از تولیدکننده به مصرف کننده
  • نحوه‌ی دسترسی از Verex AI Pipelines به ماشین مجازی مصرف‌کننده، test-svc-1
  • نحوه‌ی رد دسترسی از Verex AI Pipelines به ماشین مجازی مصرف‌کننده، test-svc-2 با استفاده از Cloud Firewall

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

۲. قبل از شروع

این آموزش از متغیرها (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

۳. تنظیمات مصرف‌کننده

ایجاد 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

پیکربندی روتر ابری و NAT

در آموزش دانلود بسته‌های نرم‌افزاری نوت‌بوک از ترجمه آدرس شبکه ابری (NAT) استفاده شده است، زیرا نمونه نوت‌بوک آدرس IP خارجی ندارد. NAT ابری قابلیت‌های NAT خروجی را ارائه می‌دهد، به این معنی که میزبان‌های اینترنتی مجاز به برقراری ارتباط با نوت‌بوک تحت مدیریت کاربر نیستند و این امر آن را ایمن‌تر می‌کند.

درون Cloud Shell، روتر ابری منطقه‌ای را ایجاد کنید.

gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1

درون Cloud Shell، دروازه‌ی منطقه‌ای cloud 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 subnet) را ایجاد کنید.

درون 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

۴. پروکسی آگاه از شناسایی (IAP) را فعال کنید

برای اینکه به IAP اجازه دهید به ماشین‌های مجازی شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه‌های ماشین مجازی که می‌خواهید با استفاده از 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

۵. ایجاد نمونه‌های ماشین مجازی مصرف‌کننده

درون 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، یک توصیف روی نمونه‌های ماشین مجازی آزمایشی انجام دهید.

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

۶. اتصال شبکه سرویس خصوصی

پیوست‌های شبکه، منابع منطقه‌ای هستند که نمایانگر سمت مصرف‌کننده‌ی یک رابط 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

به آدرس اینترنتی psc-network-attachment که توسط تولیدکننده هنگام ایجاد رابط اتصال سرویس خصوصی استفاده خواهد شد، توجه داشته باشید.

در مثال زیر، آدرس اینترنتی (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

۷. تنظیمات میز کار Vertex AI

بخش زیر شما را در ایجاد یک Jupyter Notebook راهنمایی می‌کند. این Notebook برای استقرار یک 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، حساب کاربری سرویس را با نقش Storage Admin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"

در داخل Cloud Shell، حساب کاربری سرویس را با نقش Vertex AI User به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"

در داخل Cloud Shell، حساب کاربری سرویس را با نقش Artifact Registry Admin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"

در داخل Cloud Shell، به حساب سرویس نوت‌بوک اجازه دهید از حساب سرویس پیش‌فرض Compute Engine برای نمونه‌سازی Pipeline Job استفاده کند.

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

در بخش بعدی، یک نمونه 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

۸. خطوط لوله هوش مصنوعی ورتکس برای تست اتصال 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، محدوده مقصد را به‌روزرسانی کنید تا با آدرس 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

با استفاده از IAP در Cloud Shell وارد نمونه test-svc-1 شوید.

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

۹. به‌روزرسانی عامل سرویس هوش مصنوعی ورتکس

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"

۱۰. به‌روزرسانی حساب کاربری سرویس پیش‌فرض

رابط برنامه‌نویسی کاربردی موتور محاسبات (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"

۱۱. استقرار شغل Vertex AI Pipelines

در بخش بعدی، یک دفترچه یادداشت ایجاد خواهید کرد تا یک PING موفق به نمونه test-svc-1 مصرف‌کننده انجام دهید.

کار آموزشی را در نمونه Vertex AI Workbench اجرا کنید.

  1. در کنسول گوگل کلود، به تب نمونه‌ها در صفحه Vertex AI Workbench بروید.
  2. در کنار نام نمونه Vertex AI Workbench خود (workbench-tutorial)، روی Open JupyterLab کلیک کنید. نمونه Vertex AI Workbench شما در JupyterLab باز می‌شود.
  3. فایل > جدید > دفترچه یادداشت را انتخاب کنید
  4. هسته > پایتون ۳ را انتخاب کنید
  5. در یک سلول نوت‌بوک جدید، دستور زیر را اجرا کنید تا مطمئن شوید که آخرین نسخه pip را دارید:
! pip3 install --upgrade --quiet google-cloud-aiplatform \
  kfp \
  google-cloud-pipeline-components
  1. متغیرهای پروژه خود را در سلول جدید دفترچه یادداشت تنظیم کنید
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"
  1. تعریف یک نام سطل منحصر به فرد جهانی به عنوان یک متغیر در یک سلول جدید دفترچه یادداشت
BUCKET_URI = f"gs://<your-bucket-name>"

مثال:

BUCKET_URI = f"gs://psc-vertex-bucket"
  1. در یک سلول نوت‌بوک جدید، سطل را ایجاد کنید
! gsutil mb -l {REGION} -p {PROJECT_ID} {BUCKET_URI}

در بخش بعدی، حساب کاربری پیش‌فرض سرویس موتور محاسباتی را که برای اجرای کار pipeline استفاده می‌شود، تعیین خواهید کرد و همچنین مجوزهای لازم را به آن اعطا خواهید کرد.

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}")

برای تأیید اجرای موفقیت‌آمیز، حساب کاربری سرویس و شماره پروژه شما چاپ می‌شوند.

  1. در یک سلول نوت‌بوک جدید، به حساب سرویس خود اجازه خواندن و نوشتن مصنوعات خط لوله در سطل ایجاد شده در مرحله قبل را بدهید.
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}

! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
  1. در یک سلول جدید در دفترچه یادداشت، پارامترهای خط لوله را تعریف کنید. توجه داشته باشید که NETWORK_ATTACHMENT_NAME همان PSC Network Attachment است، بنابراین باید مطابقت داشته باشد.
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/psc_test"
NETWORK_ATTACHMENT_URI = f"projects/{PROJECT_NUMBER}/regions/{REGION}/networkAttachments/{NETWORK_ATTACHMENT_NAME}"
  1. در یک سلول نوت‌بوک جدید، Vertex AI SDK را مقداردهی اولیه کنید.
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')
  1. در یک سلول جدید نوت‌بوک، کامپوننت تست را تعریف کنید.
@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
            """
        ],
    )
  1. در یک سلول جدید نوت‌بوک، خط لوله را تعریف کنید
@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
  1. در یک سلول جدید نوت‌بوک، تابع کاربردی را اجرا کنید، منتظر بمانید تا خط لوله تمام شود
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")
  1. در یک سلول نوت‌بوک جدید، تابع کاربردی را برای اجرای خط لوله اجرا کنید.
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
  1. در یک سلول نوت‌بوک جدید، خط لوله را کامپایل کنید
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
  1. در یک سلول نوت‌بوک جدید، 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}")

پس از اجرای مرحله ۱۷، تکمیل خط لوله حدود ۸ دقیقه طول خواهد کشید.

۱۲. اعتبارسنجی اتصال به test-svc-1

در سلولی که برای اجرای مرحله ۱۷ استفاده شده است، تغییر وضعیت Pipeline Job از PIPELINE_STATE_PENDING به PIPELINE_STATE_RUNNING و در نهایت PIPELINE_STATE_SUCCEEDED را مشاهده کنید که نشان دهنده پینگ موفقیت آمیز از 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

۱۳. هوش مصنوعی ورتکس، هوش مصنوعی را برای اتصال test-svc-2 پایپ‌لاین می‌کند.

در بخش بعدی، شما یک قانون فایروال ورودی ایجاد خواهید کرد تا ترافیک از زیرشبکه Vertex AI Pilelines (192.168.10.0/28) به test-svc-2 را مسدود کند و سپس Notebook را برای انعکاس آدرس IP test-svc-2 به‌روزرسانی کنید و در نهایت Pipelines Jobs را اجرا کنید.

در سلول Notebook، وضعیت کار Pipeline با عبارت Error - Pipeline Failed نمایش داده می‌شود، علاوه بر این، گزارش‌های فایروال، اطلاعاتی در مورد اتصال ناموفق ارائه می‌دهند.

یک قانون فایروال برای جلوگیری از ورود ایجاد کنید

برای رد اتصال از Vertex AI Pipelines به 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

اجرای کار خط لوله از Notebook Cell

در یک سلول نوت‌بوک جدید، TARGET_IP_ADDRESS را به‌روزرسانی کنید تا آدرس IP به‌دست‌آمده در مرحله قبل برای test-svc-2 را منعکس کند و وضعیت کار Pipelines را مشاهده کنید.

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}")

پس از اجرا، تکمیل کار pipeline حدود ۸ دقیقه طول خواهد کشید.

۱۴. اعتبارسنجی اتصال ناموفق به test-svc-2

در سلولی که برای اجرای Pipelines Job استفاده شده است، به تغییر وضعیت از PIPELINE_STATE_PENDING به PIPELINE_STATE_FAILED توجه کنید که نشان دهنده پینگ ناموفق از Vertex AI Pipelines و پاسخ از test-svc-2 است.

با استفاده از Log Explorer می‌توانید ورودی‌های ثبت وقایع فایروال را که با قانون Ingress Deny مطابقت دارند و شامل زیرشبکه Vertex AI Pipelines (192.168.10.0/28) و آدرس IP test-svc-2 هستند، مشاهده کنید.

نمایش پرس‌وجو (Show Query) را انتخاب کنید و فیلتر زیر را وارد کنید، ۱۵ دقیقه آخر و سپس اجرای پرس‌وجو (Run Query).

jsonPayload.rule_details.reference:("network:consumer-vpc/firewall:deny-icmp-vertex-pipelines-to-test-svc2-vm")

20e072f26d9a113b.png

5fb3d2de0a85e3c6.png

یک ورودی گزارش را انتخاب کنید و به دنبال آن فیلدهای تو در تو را باز کنید تا عناصر اطلاعاتی شامل Vertex AI Pipelines و آدرس IP test-svc-2 که اعتبارسنجی قانون فایروال Denied Ingress را انجام می‌دهد، آشکار شوند.

903aaf2c10d07460.png

۱۵. تمیز کردن

از 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

۱۶. تبریک

تبریک می‌گوییم، شما با موفقیت یک رابط اتصال سرویس خصوصی و اتصال مصرف‌کننده و تولیدکننده را با پیاده‌سازی فایروال مجاز و غیرمجاز Ingress پیکربندی و اعتبارسنجی کرده‌اید.

شما زیرساخت مصرف‌کننده را ایجاد کردید و یک پیوست شبکه اضافه کردید که به سرویس Vertex AI Pipelines اجازه می‌دهد PSC Interface VM را برای ایجاد پل ارتباطی مصرف‌کننده و تولیدکننده ایجاد کند. شما یاد گرفتید که چگونه قوانین فایروال را در شبکه VPC مصرف‌کننده ایجاد کنید که اتصال به نمونه‌های موجود در شبکه مصرف‌کننده را مجاز و غیرمجاز کند.

کازموپاپ فکر می‌کند آموزش‌ها فوق‌العاده هستند!!

c911c127bffdee57.jpeg

بعدش چی؟

مطالعه بیشتر و ویدیوها

اسناد مرجع