1. บทนำ
อินเทอร์เฟซ Private Service Connect เป็นทรัพยากรที่ช่วยให้เครือข่าย Virtual Private Cloud (VPC) ของผู้ผลิตเริ่มการเชื่อมต่อกับปลายทางต่างๆ ในเครือข่ายของผู้ใช้บริการได้ เครือข่ายผู้ผลิตและผู้บริโภคสามารถอยู่ในโปรเจ็กต์และองค์กรที่แตกต่างกันได้
การเชื่อมต่อระหว่างไฟล์แนบเครือข่ายกับอินเทอร์เฟซ Private Service Connect จะคล้ายกับการเชื่อมต่อระหว่างปลายทาง Private Service Connect กับไฟล์แนบบริการ แต่มีความแตกต่างที่สำคัญ 2 ประการดังนี้
- ไฟล์แนบเครือข่ายช่วยให้เครือข่ายผู้ผลิตเริ่มการเชื่อมต่อกับเครือข่ายผู้บริโภค (ขาออกของบริการที่มีการจัดการ) ในขณะที่ปลายทางช่วยให้เครือข่ายผู้บริโภคเริ่มการเชื่อมต่อกับเครือข่ายผู้ผลิต (ขาเข้าของบริการที่มีการจัดการ)
- การเชื่อมต่ออินเทอร์เฟซ Private Service Connect จะเป็นแบบทรานซิทีฟ ซึ่งหมายความว่าเครือข่ายผู้ผลิตสามารถสื่อสารกับเครือข่ายอื่นๆ ที่เชื่อมต่อกับเครือข่ายผู้บริโภคได้
สิ่งที่คุณจะสร้าง
Vertex AI Pipelines ที่ติดตั้งใช้งานในโปรเจ็กต์ผู้เช่าที่ Google จัดการจะใช้ประโยชน์จากไฟล์แนบเครือข่าย PSC เพื่อสร้างอินสแตนซ์แบบหลาย NIC ระหว่างเครือข่ายของผู้ผลิตและผู้บริโภค เนื่องจากมีการติดตั้งใช้งานการเชื่อมต่อเครือข่าย PSC ด้วย Multi-NIC จากเครือข่ายผู้ใช้ Vertex AI Pipelines จึงเข้าถึงเส้นทางที่พร้อมใช้งานจากเครือข่ายผู้ใช้ได้
ในบทแนะนำนี้ คุณจะได้สร้างสถาปัตยกรรมอินเทอร์เฟซ Private Service Connect (PSC) ที่ครอบคลุมสำหรับ Vertex AI Pipelines ซึ่งใช้กฎไฟร์วอลล์ของ Cloud เพื่ออนุญาตหรือปฏิเสธการเชื่อมต่อจากผู้ผลิตไปยังอินสแตนซ์ทดสอบของผู้บริโภคตามที่แสดงในรูปที่ 1
รูปที่ 1

คุณจะสร้าง psc-network-attachment รายการเดียวใน VPC ของผู้ใช้ ซึ่งจะส่งผลให้เกิดกรณีการใช้งานต่อไปนี้
- สร้างกฎไฟร์วอลล์ขาเข้าใน consumer-vpc ที่อนุญาตให้ซับเน็ต Vertex AI Pipeline (192.168.10.0/28) เข้าถึง test-svc-1 ยืนยันว่า PING ที่สร้างจากไปป์ไลน์งานไปยัง 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 ไปยัง VM ของผู้บริโภค test-svc-1
- วิธีปฏิเสธการเข้าถึงจากไปป์ไลน์ Verex AI ไปยัง VM ของผู้บริโภค test-svc-2 โดยใช้ Cloud Firewall
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud
- สิทธิ์ IAM
- ผู้ดูแลระบบอินสแตนซ์ Compute (roles/compute.instanceAdmin)
- ผู้ดูแลระบบเครือข่าย Compute (roles/compute.networkAdmin)
- ผู้ดูแลระบบความปลอดภัยของ Compute (roles/compute.securityAdmin)
- ผู้ใช้อุโมงค์ข้อมูลที่รักษาความปลอดภัยด้วย IAP (roles/iap.tunnelResourceAccessor)
- ผู้ดูแลระบบการบันทึก (roles/logging.admin)
- ผู้ดูแลระบบ Notebooks (roles/notebooks.admin)
- ผู้ดูแลระบบ IAM ของโปรเจ็กต์ (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) ของ Cloud สำหรับการดาวน์โหลดแพ็กเกจซอฟต์แวร์ Notebook เนื่องจากอินสแตนซ์ Notebook ไม่มีที่อยู่ IP ภายนอก Cloud NAT มีความสามารถ NAT ขาออก ซึ่งหมายความว่าระบบไม่อนุญาตให้โฮสต์อินเทอร์เน็ตเริ่มการสื่อสารกับ Notebook ที่ผู้ใช้จัดการ ทำให้มีความปลอดภัยมากขึ้น
สร้าง Cloud Router ระดับภูมิภาคภายใน Cloud Shell
gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1
สร้างเกตเวย์ Cloud NAT ระดับภูมิภาคภายใน Cloud Shell
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
สร้างซับเน็ตการเชื่อมต่อเครือข่ายที่ใช้โดย Vertex AI Pipelines ภายใน Cloud Shell
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)
หากต้องการอนุญาตให้ IAP เชื่อมต่อกับอินสแตนซ์ VM ให้สร้างกฎไฟร์วอลล์ที่มีลักษณะดังนี้
- มีผลกับอินสแตนซ์ VM ทั้งหมดที่คุณต้องการให้เข้าถึงได้โดยใช้ IAP
- อนุญาตการรับส่งข้อมูลขาเข้าจากช่วง IP 35.235.240.0/20 ช่วงนี้มีที่อยู่ IP ทั้งหมดที่ IAP ใช้สำหรับการส่งต่อ TCP
สร้างกฎไฟร์วอลล์ IAP ภายใน Cloud Shell
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
5. สร้างอินสแตนซ์ VM สำหรับผู้บริโภค
สร้างอินสแตนซ์ VM ของผู้ใช้ test-svc-1 ภายใน Cloud Shell
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
สร้างอินสแตนซ์ VM ของผู้ใช้ test-svc-2 ภายใน Cloud Shell
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 กับอินสแตนซ์ 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 ให้ระบุรายละเอียดของ Network Attachment
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 Notebook นี้จะใช้เพื่อทำให้งานไปป์ไลน์ใช้งานได้ ซึ่งจะส่ง 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 ให้บัญชีบริการของ Notebook ใช้บัญชีบริการเริ่มต้นของ Compute Engine เพื่อสร้างอินสแตนซ์ของไปป์ไลน์ 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 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 Pipelines กับ VM
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 ใช้งานได้
ในส่วนต่อไปนี้ คุณจะสร้าง Notebook เพื่อทำการ PING ไปยังอินสแตนซ์ test-svc-1 ของผู้บริโภคให้สำเร็จ
เรียกใช้งานการฝึกในอินสแตนซ์ Vertex AI Workbench
- ในคอนโซล Google Cloud ให้ไปที่แท็บอินสแตนซ์ในหน้า Vertex AI Workbench
- คลิกเปิด JupyterLab ข้างชื่ออินสแตนซ์ Vertex AI Workbench (workbench-tutorial) อินสแตนซ์ Vertex AI Workbench จะเปิดขึ้นใน JupyterLab
- เลือกไฟล์ > ใหม่ > Notebook
- เลือก Kernel > Python 3
- ในเซลล์ Notebook ใหม่ ให้เรียกใช้คำสั่งต่อไปนี้เพื่อให้แน่ใจว่าคุณมี pip เวอร์ชันล่าสุด
! pip3 install --upgrade --quiet google-cloud-aiplatform \
kfp \
google-cloud-pipeline-components
- ตั้งค่าตัวแปรโปรเจ็กต์ในเซลล์ Notebook ใหม่
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 ที่ไม่ซ้ำกันทั่วโลกเป็นตัวแปรในเซลล์ Notebook ใหม่
BUCKET_URI = f"gs://<your-bucket-name>"
ตัวอย่าง
BUCKET_URI = f"gs://psc-vertex-bucket"
- สร้างที่เก็บข้อมูลในเซลล์ Notebook ใหม่
! 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}")
ระบบจะพิมพ์บัญชีบริการและหมายเลขโปรเจ็กต์เพื่อให้แน่ใจว่าการดำเนินการสำเร็จ
- ในเซลล์ Notebook ใหม่ ให้สิทธิ์บัญชีบริการในการอ่านและเขียนอาร์ติแฟกต์ของไปป์ไลน์ใน Bucket ที่สร้างขึ้นในขั้นตอนก่อนหน้า
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
- กำหนดพารามิเตอร์ของไปป์ไลน์ในเซลล์ Notebook ใหม่ โปรดทราบว่า 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}"
- เริ่มต้น Vertex AI SDK ในเซลล์ Notebook ใหม่
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')
- กำหนดคอมโพเนนต์การทดสอบในเซลล์ Notebook ใหม่
@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
"""
],
)
- กำหนดไปป์ไลน์ในเซลล์ Notebook ใหม่
@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
- ในเซลล์ Notebook ใหม่ ให้เรียกใช้ฟังก์ชันยูทิลิตี แล้วรอให้ไปป์ไลน์เสร็จสิ้น
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")
- ในเซลล์ Notebook ใหม่ ให้เรียกใช้ฟังก์ชันยูทิลิตีเพื่อเรียกใช้ไปป์ไลน์
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
- คอมไพล์ไปป์ไลน์ในเซลล์ Notebook ใหม่
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
- ในเซลล์ Notebook ใหม่ ให้อัปเดต 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 ซึ่งให้บันทึกที่ระบุการรับส่งข้อมูลแบบ 2 ทาง
ในตัวอย่าง 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. การเชื่อมต่อ AI ของ Vertex AI Pipelines กับ test-svc-2
ในส่วนต่อไปนี้ คุณจะสร้างกฎไฟร์วอลล์ขาเข้าเพื่อปฏิเสธการรับส่งข้อมูลจากซับเน็ต Vertex AI Pipelines (192.168.10.0/28) ไปยัง test-svc-2 จากนั้นอัปเดต Notebook เพื่อแสดงที่อยู่ IP ของ test-svc-2 และสุดท้ายคือเรียกใช้การเรียกใช้ของ Pipelines Jobs
ในเซลล์ 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
เรียกใช้งานไปป์ไลน์จากเซลล์ Notebook
ในเซลล์ Notebook ใหม่ ให้อัปเดต 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}")
เมื่อดำเนินการแล้ว งานไปป์ไลน์จะใช้เวลาประมาณ 8 นาทีจึงจะเสร็จสมบูรณ์
14. ตรวจสอบการเชื่อมต่อที่ล้มเหลวกับ test-svc-2
ในเซลล์ที่ใช้เรียกใช้งานไปป์ไลน์ ให้สังเกตการเปลี่ยนสถานะจาก PIPELINE_STATE_PENDING เป็น PIPELINE_STATE_FAILED ซึ่งบ่งบอกว่าการ Ping จาก Vertex AI Pipelines ไม่สำเร็จ และการตอบกลับจาก test-svc-2
เมื่อใช้ Log Explorer คุณจะดูรายการการบันทึกไฟร์วอลล์ที่ตรงกับกฎ Ingress Deny ซึ่งประกอบด้วยเครือข่ายย่อย 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 Pipelines และที่อยู่ 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 สร้าง VM อินเทอร์เฟซ PSC เพื่อเชื่อมต่อการสื่อสารระหว่างผู้ใช้และผู้ให้บริการ คุณได้เรียนรู้วิธีสร้างกฎไฟร์วอลล์ในเครือข่าย VPC ของผู้บริโภคที่อนุญาตและปฏิเสธการเชื่อมต่อกับอินสแตนซ์ในเครือข่ายของผู้บริโภค
Cosmopup คิดว่าบทแนะนำนั้นยอดเยี่ยมมาก!!
