1. บทนำ
อินเทอร์เฟซ Private Service Connect เป็นทรัพยากรที่ช่วยให้เครือข่าย Virtual Private Cloud (VPC) ของผู้ผลิตเริ่มการเชื่อมต่อกับปลายทางต่างๆ ในเครือข่าย VPC ของผู้ใช้บริการได้ เครือข่ายผู้ผลิตและผู้บริโภคสามารถอยู่ในโปรเจ็กต์และองค์กรที่แตกต่างกันได้
หากไฟล์แนบเครือข่ายยอมรับการเชื่อมต่อจากอินเทอร์เฟซ Private Service Connect แล้ว Google Cloud จะจัดสรรที่อยู่ IP จากซับเน็ตของผู้ใช้ที่ไฟล์แนบเครือข่ายระบุไว้ให้กับอินเทอร์เฟซ เครือข่ายผู้บริโภคและเครือข่ายผู้ผลิตเชื่อมต่อกันและสื่อสารกันได้โดยใช้ที่อยู่ IP ภายใน
การเชื่อมต่อระหว่างไฟล์แนบเครือข่ายกับอินเทอร์เฟซ Private Service Connect จะคล้ายกับการเชื่อมต่อระหว่างปลายทาง Private Service Connect กับไฟล์แนบบริการ แต่มีความแตกต่างที่สำคัญ 2 ประการดังนี้
- ไฟล์แนบเครือข่ายช่วยให้เครือข่ายผู้ผลิตเริ่มการเชื่อมต่อกับเครือข่ายผู้บริโภค (ขาออกของบริการที่มีการจัดการ) ในขณะที่ปลายทางช่วยให้เครือข่ายผู้บริโภคเริ่มการเชื่อมต่อกับเครือข่ายผู้ผลิต (ขาเข้าของบริการที่มีการจัดการ)
- การเชื่อมต่ออินเทอร์เฟซ Private Service Connect จะเป็นแบบทรานซิทีฟ ซึ่งหมายความว่าเครือข่ายผู้ผลิตจะสื่อสารกับเครือข่ายอื่นๆ ที่เชื่อมต่อกับเครือข่ายผู้บริโภคได้
ข้อควรพิจารณาเกี่ยวกับความสามารถในการเข้าถึงอินเทอร์เฟซ PSC ของ Vertex AI
- PSC-Interface สามารถกำหนดเส้นทางการรับส่งข้อมูลไปยังปลายทาง VPC หรือปลายทางในองค์กรภายในบล็อกที่อยู่ RFC1918
- การกำหนดเป้าหมายอินเทอร์เฟซ PSC ไปยังบล็อกที่อยู่ที่ไม่ใช่ rfc-1918 ต้องมีการติดตั้งใช้งานพร็อกซีอย่างชัดเจนใน VPC ของผู้ใช้ที่มีที่อยู่ rfc-1918 ในการติดตั้งใช้งาน Vertex AI คุณต้องกำหนดพร็อกซีพร้อมกับ FQDN ของปลายทางเป้าหมาย ดูรูปที่ 1 ซึ่งแสดงถึงพร็อกซีที่ชัดเจนซึ่งกำหนดค่าไว้ใน VPC ของลูกค้าเพื่ออำนวยความสะดวกในการกำหนดเส้นทางไปยัง CIDR ที่ไม่ใช่ rfc-1918 ต่อไปนี้
[1] 240.0.0.0/4
[2] 203.0.113.0/2
[3]10.10.20.0/28 ไม่ต้องใช้พร็อกซี อยู่ในช่วง rfc1918
- เมื่อกำหนดค่าการติดตั้งใช้งานที่มีเฉพาะอินเทอร์เฟซ PSC การติดตั้งใช้งานจะยังคงมีการเข้าถึงอินเทอร์เน็ตเริ่มต้น การรับส่งข้อมูลขาออกนี้จะออกจากเครือข่ายผู้เช่าที่ปลอดภัยซึ่ง Google จัดการโดยตรง
ข้อควรพิจารณาเกี่ยวกับ VPC-SC ของอินเทอร์เฟซ PSC ของ Vertex AI
- เมื่อโปรเจ็กต์เป็นส่วนหนึ่งของขอบเขตการควบคุมบริการ VPC ขอบเขตจะบล็อกการเข้าถึงอินเทอร์เน็ตเริ่มต้นของผู้เช่าที่ Google จัดการเพื่อป้องกันการกรองข้อมูล
- หากต้องการอนุญาตให้การติดตั้งใช้งานเข้าถึงอินเทอร์เน็ตสาธารณะในสถานการณ์นี้ คุณต้องกำหนดค่าเส้นทางการออกที่ปลอดภัยซึ่งกำหนดเส้นทางการรับส่งข้อมูลผ่าน VPC อย่างชัดแจ้ง วิธีที่แนะนำในการดำเนินการนี้คือการตั้งค่าพร็อกซีเซิร์ฟเวอร์ภายในขอบเขต VPC ด้วยที่อยู่ RFC1918 และสร้างเกตเวย์ Cloud NAT เพื่ออนุญาตให้ VM พร็อกซีเข้าถึงอินเทอร์เน็ต
ดูข้อมูลเพิ่มเติมได้ที่แหล่งข้อมูลต่อไปนี้
ตั้งค่าอินเทอร์เฟซ Private Service Connect สำหรับทรัพยากร Vertex AI | Google Cloud
สิ่งที่คุณจะสร้าง
ในบทแนะนำนี้ คุณจะได้สร้างการติดตั้งใช้งาน Vertex AI Pipelines ที่ครอบคลุมด้วยอินเทอร์เฟซ Private Service Connect (PSC) เพื่ออนุญาตการเชื่อมต่อจากผู้ผลิตไปยังการประมวลผลของผู้บริโภคตามที่แสดงในรูปที่ 1 โดยกำหนดเป้าหมายไปยังปลายทางที่ไม่ใช่ rfc-1928
รูปที่ 2
คุณจะสร้าง psc-network-attachment รายการเดียวใน VPC ของผู้ใช้โดยใช้ประโยชน์จากการเพียร์ DNS เพื่อแก้ไข VM ของผู้ใช้ในโปรเจ็กต์ผู้เช่าที่โฮสต์ Vertex AI Training ซึ่งจะส่งผลให้เกิดกรณีการใช้งานต่อไปนี้
- ติดตั้งใช้งาน Vertex AI Pipelines และกำหนดค่า VM พร็อกซีให้ทำหน้าที่เป็นพร็อกซีที่ชัดเจน ซึ่งจะช่วยให้ดำเนินการ wget กับ VM ในซับเน็ตคลาส E ได้
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างการเชื่อมต่อเครือข่าย
- วิธีที่โปรดิวเซอร์ใช้การเชื่อมต่อเครือข่ายเพื่อสร้างอินเทอร์เฟซ PSC
- วิธีสร้างการสื่อสารจากผู้ผลิตไปยังผู้บริโภคโดยใช้การ Peering ของ DNS
- วิธีสร้างการสื่อสารไปยังพื้นที่ที่อยู่ IP ที่ไม่ใช่ rfc1918 จาก Vertex AI Pipelines
สิ่งที่คุณต้องมี
โปรเจ็กต์ Google Cloud
สิทธิ์ IAM
- ผู้ดูแลระบบเครือข่าย Compute (roles/compute.networkAdmin)
- ผู้ดูแลระบบอินสแตนซ์ Compute (roles/compute.instanceAdmin)
- ผู้ดูแลระบบความปลอดภัยของ Compute (roles/compute.securityAdmin)
- ผู้ดูแลระบบ DNS (roles/dns.admin)
- ผู้ใช้อุโมงค์ข้อมูลที่รักษาความปลอดภัยด้วย IAP (roles/iap.tunnelResourceAccessor)
- ผู้ดูแลระบบการบันทึก (roles/logging.admin)
- ผู้ดูแลระบบ Notebooks (roles/notebooks.admin)
- ผู้ดูแลระบบ IAM ของโปรเจ็กต์ (roles/resourcemanager.projectIamAdmin)
- ผู้ดูแลระบบบัญชีบริการ (roles/iam.serviceAccountAdmin)
- ผู้ดูแลระบบการใช้บริการ (roles/serviceusage.serviceUsageAdmin)
2. ก่อนเริ่มต้น
อัปเดตโปรเจ็กต์เพื่อรองรับบทแนะนำ
บทแนะนำนี้ใช้ $variables เพื่อช่วยในการติดตั้งใช้งานการกำหนดค่า gcloud ใน Cloud Shell
ใน Cloud Shell ให้ทำดังนี้
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
การเปิดใช้ API
ใน Cloud Shell ให้ทำดังนี้
gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "dns.googleapis.com"
gcloud services enable "notebooks.googleapis.com"
gcloud services enable "storage.googleapis.com"
gcloud services enable "cloudresourcemanager.googleapis.com"
gcloud services enable "artifactregistry.googleapis.com"
gcloud services enable "cloudbuild.googleapis.com"
3. การตั้งค่าสำหรับผู้บริโภค
สร้าง VPC ของผู้ใช้
ใน Cloud Shell ให้ทำดังนี้
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
สร้างซับเน็ตผู้ใช้
ใน Cloud Shell ให้ทำดังนี้
gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1
ใน Cloud Shell ให้ทำดังนี้
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1
สร้างซับเน็ตไฟล์แนบเครือข่าย Private Service Connect
ใน Cloud Shell ให้ทำดังนี้
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
การกำหนดค่า Cloud Router และ NAT
ในบทแนะนำนี้ Cloud NAT ใช้เพื่อให้สิทธิ์เข้าถึงอินเทอร์เน็ตสำหรับ VM พร็อกซีที่ไม่มีที่อยู่ IP สาธารณะ Cloud NAT ช่วยให้ VM ที่มีที่อยู่ IP ส่วนตัวเท่านั้นเชื่อมต่อกับอินเทอร์เน็ตได้ ทำให้ VM สามารถทำงานต่างๆ เช่น ติดตั้งแพ็กเกจซอฟต์แวร์
สร้าง Cloud Router ภายใน Cloud Shell
gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1
สร้างเกตเวย์ NAT ภายใน Cloud Shell
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1 --enable-logging --log-filter=ALL
4. เปิดใช้ 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 ของผู้ใช้ class-e-vm ใน Cloud Shell
gcloud compute instances create class-e-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=class-e-subnet \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Class-e server !!' | tee /var/www/html/index.html
EOF"
สร้างอินสแตนซ์ VM ของผู้ใช้ใน Cloud Shell ซึ่งก็คือ proxy-vm ที่จะทำหน้าที่เป็นพร็อกซีที่ชัดเจนสำหรับ Vertex AI Pipelines เราจะใช้ tinyproxy เป็นแอปพลิเคชันสำหรับพร็อกซีการรับส่งข้อมูล HTTP แม้ว่าจะรองรับ HTTPS ด้วยก็ตาม
gcloud compute instances create proxy-vm \
--project=$projectid \
--machine-type=e2-micro \
--image-family debian-11 \
--no-address \
--can-ip-forward \
--shielded-secure-boot \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=rfc1918-subnet1 \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump
sudo apt-get install tinyproxy -y
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'proxy server !!' | tee /var/www/html/index.html
EOF"
6. ไฟล์แนบเครือข่าย Private Service Connect
ไฟล์แนบเครือข่ายเป็นทรัพยากรระดับภูมิภาคที่แสดงฝั่งผู้บริโภคของอินเทอร์เฟซ Private Service Connect คุณเชื่อมโยงซับเน็ตเดียวกับการเชื่อมต่อเครือข่าย และผู้ผลิตจะกำหนด IP ให้กับอินเทอร์เฟซ Private Service Connect จากซับเน็ตนั้น ซับเน็ตต้องอยู่ในภูมิภาคเดียวกับการเชื่อมต่อเครือข่าย การเชื่อมต่อเครือข่ายต้องอยู่ในภูมิภาคเดียวกับบริการผู้ผลิต
สร้างการเชื่อมต่อเครือข่าย
สร้างการเชื่อมต่อเครือข่ายภายใน Cloud Shell
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_AUTOMATIC \
--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 ใน Cloud Console ให้ไปที่
บริการเครือข่าย → Private Service Connect → ไฟล์แนบเครือข่าย → psc-network-attachment
7. โซน DNS ส่วนตัว
คุณจะสร้างโซน Cloud DNS สำหรับ demo.com และป้อนระเบียน A ที่ชี้ไปยังที่อยู่ IP ของ VM จากนั้นจะมีการติดตั้งใช้งานการ Peering DNS ในงาน Vertex AI Pipelines ซึ่งจะช่วยให้เข้าถึงระเบียน DNS ของผู้บริโภคได้
ใน Cloud Shell ให้ทำดังนี้
gcloud dns --project=$projectid managed-zones create private-dns-codelab --description="" --dns-name="demo.com." --visibility="private" --networks="https://compute.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc"
ใน Cloud Shell ให้เรียกใช้คำสั่ง "describe" กับอินสแตนซ์ VM เพื่อรับที่อยู่ IP ที่เกี่ยวข้อง
gcloud compute instances describe class-e-vm --zone=us-central1-a | grep networkIP:
gcloud compute instances describe proxy-vm --zone=us-central1-a | grep networkIP:
ใน Cloud Shell ให้สร้างชุดระเบียนสำหรับ VM, class-e-vm และตรวจสอบว่าได้อัปเดตที่อยู่ IP ตามเอาต์พุตของสภาพแวดล้อมแล้ว
gcloud dns --project=$projectid record-sets create class-e-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="240.0.0.2"
ภายใน Cloud Shell ให้สร้างชุดระเบียนสำหรับ VM, proxy-vm และตรวจสอบว่าได้อัปเดตที่อยู่ IP ตามเอาต์พุตของสภาพแวดล้อมแล้ว
gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"
สร้างกฎไฟร์วอลล์ของ Cloud เพื่ออนุญาตการเข้าถึงจากอินเทอร์เฟซ PSC
ในส่วนต่อไปนี้ ให้สร้างกฎไฟร์วอลล์ที่อนุญาตการรับส่งข้อมูลที่มาจาก PSC Network Attachment เพื่อเข้าถึงทรัพยากรการคำนวณ RFC1918 ใน VPC ของผู้ใช้
ใน Cloud Shell ให้สร้างกฎไฟร์วอลล์ขาเข้าที่อนุญาตการเข้าถึงจากซับเน็ตการแนบเครือข่าย PSC ไปยัง proxy-vm
gcloud compute firewall-rules create allow-access-to-proxy \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--destination-ranges="10.10.0.0/19" \
--enable-logging
ใน Cloud Shell ให้สร้างกฎไฟร์วอลล์ขาเข้าที่อนุญาตการเข้าถึงจากซับเน็ต proxy-vm ไปยังซับเน็ต class-e
gcloud compute firewall-rules create allow-access-to-class-e \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="10.10.10.0/28" \
--destination-ranges="240.0.0.0/4" \
--enable-logging
8. อัปเดตพร็อกซีที่ชัดเจน
ในส่วนต่อไปนี้ คุณจะต้องใช้ SSH เพื่อเข้าสู่พร็อกซีที่ชัดเจนและอัปเดตไฟล์การกำหนดค่า tinyproxy.conf จากนั้นทำการรีเซ็ต
จาก Cloud Shell
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
เปิดไฟล์การกำหนดค่า tinyproxy แล้วอัปเดตโดยใช้โปรแกรมแก้ไขหรือโปรแกรมที่คุณเลือก ด้านล่างนี้เป็นตัวอย่างการใช้ VIM
sudo vim /etc/tinyproxy/tinyproxy.conf
# Locate the "Listen" configuration line to restrict listening to only its private IP address of the Proxy-VM, rather than all interfaces.
Listen 10.10.10.2
# Locate the "Allow" configuration line to allow requests ONLY from the PSC Network Attachment Subnet
Allow 192.168.10.0/24
Save the configs by the following steps:
1. Press the `ESC` key to enter Command Mode.
2. Type `:wq` to save (w) and quit (q).
3. Press `Enter`
Restart the tinyproxy service to apply the changes:
sudo systemctl restart tinyproxy
Validate the tinyproxy service is running:
sudo systemctl status tinyproxy
Perform an exit returning to cloud shell
exit
9. สร้างสมุดบันทึก Jupyter
ส่วนต่อไปนี้จะแนะนำวิธีสร้างสมุดบันทึก Jupyter ระบบจะใช้ Notebook นี้เพื่อติดตั้งใช้งานงาน Vertex AI Pipelines ที่ส่ง wget จาก Vertex AI Pipelines ไปยังอินสแตนซ์ทดสอบ เส้นทางข้อมูลระหว่าง Vertex AI Pipelines กับเครือข่ายผู้บริโภคที่มีอินสแตนซ์จะใช้อินเทอร์เฟซเครือข่าย Private Service Connect
สร้างบัญชีบริการที่ผู้ใช้จัดการ
ในส่วนต่อไปนี้ คุณจะสร้างบัญชีบริการที่จะเชื่อมโยงกับอินสแตนซ์ Vertex AI Workbench ที่ใช้ในบทแนะนำ
ในบทแนะนำ บัญชีบริการจะมีบทบาทต่อไปนี้
- ผู้ดูแลระบบพื้นที่เก็บข้อมูล
- ผู้ใช้ Vertex AI
- ผู้ดูแลระบบ Artifact Registry
- ผู้แก้ไข Cloud Build
- ผู้ใช้บัญชีบริการ IAM
สร้างบัญชีบริการภายใน 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 ให้อัปเดตบัญชีบริการด้วยบทบาทผู้แก้ไข Cloud Build
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
ใน Cloud Shell ให้สิทธิ์บัญชีบริการของ Notebook ในการใช้บัญชีบริการเริ่มต้นของ Compute Engine
gcloud iam service-accounts add-iam-policy-binding \
$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')-compute@developer.gserviceaccount.com \
--member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
10. สร้างอินสแตนซ์ Vertex AI Workbench
ในส่วนต่อไปนี้ ให้สร้างอินสแตนซ์ Vertex AI Workbench ที่รวมบัญชีบริการ notebook-sa ที่สร้างไว้ก่อนหน้านี้
สร้างอินสแตนซ์ไคลเอ็นต์ส่วนตัวภายใน Cloud Shell
gcloud workbench instances create workbench-tutorial --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=rfc1918-subnet1 --disable-public-ip --shielded-secure-boot=true --shielded-integrity-monitoring=true --shielded-vtpm=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com
11. การอัปเดตตัวแทนบริการ Vertex AI
Vertex AI จะดำเนินการในนามของคุณเพื่อดำเนินการต่างๆ เช่น การขอที่อยู่ IP จากซับเน็ตการแนบเครือข่าย PSC ที่ใช้สร้างอินเทอร์เฟซ PSC โดย Vertex AI จะใช้ตัวแทนบริการ (แสดงอยู่ด้านล่าง) ที่ต้องมีสิทธิ์ผู้ดูแลระบบเครือข่าย
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
รับหมายเลขโปรเจ็กต์ภายใน Cloud Shell
gcloud projects describe $projectid | grep projectNumber
รับหมายเลขโปรเจ็กต์ภายใน Cloud Shell
gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'
ตั้งค่าหมายเลขโปรเจ็กต์ภายใน Cloud Shell
projectnumber=YOUR-PROJECT-Number
สร้างบัญชีบริการสำหรับ AI Platform ใน Cloud Shell ข้ามขั้นตอนนี้หากคุณมีบัญชีบริการในโปรเจ็กต์อยู่แล้ว
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
ใน Cloud Shell ให้อัปเดตบัญชีตัวแทนบริการด้วยบทบาท compute.networkAdmin
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
ใน Cloud Shell ให้อัปเดตบัญชีตัวแทนบริการด้วยบทบาท dns.peer
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"
การอัปเดตบัญชีบริการเริ่มต้น
เปิดใช้ Compute Engine API และให้สิทธิ์เข้าถึง Vertex AI แก่บัญชีบริการเริ่มต้น โปรดทราบว่าระบบอาจใช้เวลาสักครู่ในการเผยแพร่การเปลี่ยนแปลงสิทธิ์เข้าถึง
ใน Cloud Shell ให้อัปเดตบัญชีบริการเริ่มต้นด้วยบทบาท aiplatform.user
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
ใน Cloud Shell ให้อัปเดตบัญชีบริการเริ่มต้นด้วยบทบาท storage.admin
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
ใน Cloud Shell ให้อัปเดตบัญชีบริการเริ่มต้นด้วยบทบาท storage.admin
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. เปิดใช้ Tcpdump
หากต้องการตรวจสอบการเชื่อมต่อ IP จาก Vertex AI Pipelines เราสามารถใช้ TCPDUMP ได้ ซึ่งจะช่วยให้เราสังเกตการสื่อสารที่มาจากซับเน็ตการเชื่อมต่อเครือข่าย PSC, 192.168.10.0/28 เมื่อเรียกใช้คำขอ GET จาก Vertex AI Pipelines ไปยัง VM, class-e-vm.demo.com (240.0.0.0/4)
จาก Cloud Shell ให้ ssh ไปยัง VM พร็อกซี
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
จากระบบปฏิบัติการของ proxy-vm ให้เรียกใช้การกรอง tcpdump ใน class-e-vm และซับเน็ตการแนบเครือข่าย PSC
sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn
เปิดแท็บ Cloud Shell ใหม่ อัปเดตตัวแปรโปรเจ็กต์ แล้ว SSH ไปยัง class-e-vm
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
จากระบบปฏิบัติการของ class-e-vm ให้เรียกใช้การกรอง tcpdump ในเครือข่ายย่อย proxy-vm
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. ทำให้งาน Vertex AI Pipelines ใช้งานได้
ในส่วนต่อไปนี้ คุณจะสร้าง Notebook เพื่อดำเนินการ wget จาก Vertex AI Pipelines ไปยังพร็อกซีที่ชัดเจนให้สำเร็จ ซึ่งจะช่วยให้คุณเข้าถึง VM ที่ไม่ใช่ RFC 1918 ได้ เช่น class-e-vm Vertex AI Pipelines ไม่จำเป็นต้องใช้พร็อกซีที่ชัดเจนในการเข้าถึง rfc1918-vm เนื่องจากเป้าหมายคือที่อยู่ IP RFC 1918
เรียกใช้งานการฝึกในอินสแตนซ์ Vertex AI Workbench
- ในคอนโซล Google Cloud ให้ไปที่แท็บอินสแตนซ์ในหน้า Vertex AI Workbench
- คลิกเปิด JupyterLab ข้างชื่ออินสแตนซ์ Vertex AI Workbench (workbench-tutorial) อินสแตนซ์ Vertex AI Workbench จะเปิดขึ้นใน JupyterLab
- เลือกไฟล์ > ใหม่ > Notebook
- เลือก Kernel > Python 3
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
# Install gcloud
!pip install google-cloud
# Install the pipeline required packages
!pip install --upgrade google-cloud-aiplatform \
google-cloud-storage \
kfp \
google-cloud-pipeline-components
# Import libraries
from time import gmtime, strftime
import json
import requests
ในสมุดบันทึก JupyterLab ให้สร้างเซลล์ใหม่ อัปเดตและเรียกใช้รายการต่อไปนี้ อย่าลืมอัปเดต PROJECT_ID ด้วยรายละเอียดของสภาพแวดล้อม
import json
import requests
import pprint
PROJECT_ID = 'YOUR-PROJECT-ID' #Enter your project ID
PROJECT_NUMBER=!gcloud projects list --filter="project_id:$PROJECT_ID" --format="value(PROJECT_NUMBER)"
PROJECT_NUMBER=str(PROJECT_NUMBER).strip('[').strip(']').strip("'")
print(PROJECT_NUMBER)
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
# us-central1 is used for the codelab
REGION = "us-central1" #@param {type:"string"}
SERVICE_NAME = "aiplatform" #@param {type:"string"}
SERVICE ="{}.googleapis.com".format(SERVICE_NAME)
ENDPOINT="{}-{}.googleapis.com".format(REGION, SERVICE_NAME)
API_VERSION = "v1" # @param {type: "string"}
LOCATION = REGION
ในสมุดบันทึก JupyterLab ให้สร้างเซลล์ใหม่และเรียกใช้การกำหนดค่าด้านล่าง โดยสังเกตไฮไลต์ต่อไปนี้
- proxy_server = "http://proxy-vm.demo.com:8888" FQDN เชื่อมโยงกับ VM พร็อกซีที่ทําให้ใช้งานได้ใน VPC ของผู้ใช้ เราใช้การ Peering DNS เพื่อแก้ปัญหา FQDN ในขั้นตอนถัดไป
%%writefile main.py
import logging
import socket
import sys
import os
def make_api_request(url: str, proxy_vm_ip: str, proxy_vm_port: str):
"""
Makes a GET request to a non-rfc1918 API and saves the response.
Args:
url: The URL of the API to send the request to.
"""
import requests
try:
# response = requests.get(url)
proxy_server = f"http://proxy-vm.demo.com:8888" # replace with you VM's IP and proxy port.
proxies = {
"http": proxy_server,
"https": proxy_server,
}
response = requests.get(url, proxies=proxies)
logging.info(response.text)
response.raise_for_status() # Raise an exception for bad status codes
logging.info(f"Successfully fetched data from {url}")
except requests.exceptions.RequestException as e:
logging.error(f"An error occurred: {e}")
raise e
if __name__ == '__main__':
# Configure logging to print clearly to the console
logging.basicConfig(
level=logging.INFO,
format='%(levelname)s: %(message)s',
stream=sys.stdout
)
url_to_test = os.environ['NONRFC_URL']
proxy_vm_ip = os.environ['PROXY_VM_IP']
proxy_vm_port = os.environ['PROXY_VM_PORT']
logging.info(f"url_to_test: {url_to_test}")
logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
logging.info(f"proxy_vm_port: {proxy_vm_port}")
make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
%%writefile Dockerfile
FROM python:3.9-slim
RUN apt-get update && \
apt-get install -y iputils-ping && \
apt-get install -y wget
RUN pip install cloudml-hypertune requests kfp
COPY main.py /main.py
ENTRYPOINT ["python3", "/main.py"]
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
IMAGE_PROJECT = PROJECT_ID
IMAGE_REPO = 'pipelines-test-repo-psc'
IMAGE_NAME = 'nonrfc-ip-call'
TAG = 'v1'
IMAGE_URI= f'us-central1-docker.pkg.dev/{IMAGE_PROJECT}/{IMAGE_REPO}/{IMAGE_NAME}:{TAG}'
IMAGE_URI
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
!gcloud auth configure-docker us-docker.pkg.dev --quiet
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้ ไม่สนใจข้อผิดพลาด (gcloud.builds.submit) หากมี
!gcloud builds submit --tag {IMAGE_URI} --region=us-central1
สร้างและเรียกใช้เซลล์ด้านล่างใน Notebook ของ JupyterLab โดยสังเกตไฮไลต์ต่อไปนี้
- การเชื่อมต่อ DNS กับ VPC ของผู้บริโภคได้รับการกำหนดค่าโดยใช้ dnsPeeringConfigs (dnsPeeringConfigs) สำหรับชื่อโดเมน demo.com
- พร็อกซีที่ชัดเจนซึ่งกำหนดเป็นตัวแปร PROXY_VM_IP คือ proxy-vm.demo.com ระบบจะจัดการการแก้ปัญหาผ่านการ Peering DNS ภายใน VPC ของผู้บริโภค
- พอร์ต 8888 คือพอร์ตที่กำลังรอการเชื่อมต่อ (ค่าเริ่มต้น) ที่กำหนดค่าไว้ใน tinyproxy
- Wget ไปยัง class-e-vm-demo.com จะได้รับการแก้ไขผ่านการเพียร์ DNS
- โค้ดจะระบุ "psc-network-attachment" สำหรับ Vertex เพื่อให้ใช้ซับเน็ตการเชื่อมต่อเครือข่ายในการติดตั้งใช้งานอินสแตนซ์อินเทอร์เฟซ PSC 2 รายการ
import json
from datetime import datetime
JOB_ID_PREFIX='test_psci-nonRFC' #@param {type:"string"}
JOB_ID = '{}_{}'.format(JOB_ID_PREFIX, datetime.now().strftime("%Y%m%d%H%M%S"))
# PSC-I configs
PRODUCER_PROJECT_ID = PROJECT_ID
DNS_DOMAIN = 'class-e-vm.demo.com' #@param {type:"string"}
NON_RFC_URL = f"http://{DNS_DOMAIN}"
PROXY_VM_IP = "proxy-vm.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8888" #@param {type:"string"}
CUSTOM_JOB = {
"display_name": JOB_ID,
"job_spec": {
"worker_pool_specs": [
{
"machine_spec": {
"machine_type": "n1-standard-4",
},
"replica_count": 1,
"container_spec": {
"image_uri": IMAGE_URI,
"env": [{
"name": "NONRFC_URL",
"value": NON_RFC_URL
},
{
"name": "PROXY_VM_IP",
"value": PROXY_VM_IP
},
{
"name": "PROXY_VM_PORT",
"value": PROXY_VM_PORT
}]
},
},
],
"enable_web_access": True,
"psc_interface_config": {
"network_attachment": "psc-network-attachment",
"dns_peering_configs": [
{
"domain": "demo.com.",
"target_project": PROJECT_ID,
"target_network": "consumer-vpc"
},
]
},
}
}
print(json.dumps(CUSTOM_JOB, indent=2))
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
import requests
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/customJobs/"
print("request_uri: ", request_uri)
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
response_autopush = requests.post(request_uri, json=CUSTOM_JOB, headers=headers)
response = response_autopush
print("response:", response)
if response.reason == 'OK':
job_name = response.json()['name']
job_id = job_name.split('/')[-1]
print("Created Job: ", response.json()['name'])
else:
print(response.text)
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
# Print KFP SDK version (should be >= 1.6)
! python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
# Print AI Platform version
! python3 -c "from google.cloud import aiplatform; print('AI Platform version: {}'.format(aiplatform.__version__))"
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
!gcloud storage buckets create gs://{BUCKET_URI}
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
# pipeline parameters
CACHE_PIPELINE = False # @param {type: "string"}
_DEFAULT_IMAGE = IMAGE_URI
BUCKET_URI = "gs://{BUCKET_URI}" # @param {type: "string"}
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/intro"
PIPELINE_DISPLAY_NAME = "pipeline_nonRFCIP" # @param {type: "string"}
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
from re import S
import kfp
from kfp import dsl
from kfp.dsl import container_component, ContainerSpec
from kfp import compiler
from google.cloud import aiplatform
# ==== Component with env variable ====
@container_component
def dns_peering_test_op(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
return ContainerSpec(
image=_DEFAULT_IMAGE,
command=["bash", "-c"],
args=[
"""
apt-get update && apt-get install inetutils-traceroute inetutils-ping netcat-openbsd curl -y
echo "Local IP(s): $(hostname -I)"
echo "Attempting to trace route to %s"
traceroute -w 1 -m 7 "%s"
echo "Sending curl requests to http://%s via proxy %s:%s and recording trace..."
if curl -L -v --trace-ascii /dev/stdout -x http://%s:%s "http://%s"; then
echo "Curl request succeeded!"
else
echo "Curl request failed!"
exit 1
fi
""" % (dns_domain, dns_domain, dns_domain, proxy_vm_ip, proxy_vm_port, proxy_vm_ip, proxy_vm_port, dns_domain)
]
)
# ==== Pipeline ====
@dsl.pipeline(
name="dns-peering-test-pipeline",
description="Test DNS Peering using env variable",
pipeline_root=PIPELINE_ROOT,
)
def dns_peering_test_pipeline(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
dns_test_task = dns_peering_test_op(dns_domain=dns_domain, proxy_vm_ip=proxy_vm_ip, proxy_vm_port=proxy_vm_port)
dns_test_task.set_caching_options(enable_caching=CACHE_PIPELINE)
# ==== Compile pipeline ====
if __name__ == "__main__":
aiplatform.init(project=PROJECT_ID, location=LOCATION)
compiler.Compiler().compile(
pipeline_func=dns_peering_test_pipeline,
package_path="dns_peering_test_pipeline.yaml",
)
print("✅ Pipeline compiled to dns_peering_test_pipeline.yaml")
สร้างเซลล์ใหม่ในสมุดบันทึก JupyterLab แล้วเรียกใช้คำสั่งต่อไปนี้
# Define the PipelineJob body; see API Reference https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.pipelineJobs/create
import requests, json
import datetime
bearer_token = !gcloud auth application-default print-access-token
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(bearer_token[0]),
}
request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/pipelineJobs/"
print("request_uri: ", request_uri)
14. การตรวจสอบอินเทอร์เฟซ PSC
นอกจากนี้ คุณยังดู IP ของการเชื่อมต่อเครือข่ายที่ไปป์ไลน์ Vertax AI ใช้ได้โดยไปที่
บริการเครือข่าย → Private Service Connect → ไฟล์แนบเครือข่าย → psc-network-attachment
เลือกโปรเจ็กต์ผู้เช่า (ชื่อโปรเจ็กต์ที่ลงท้ายด้วย -tp)
ฟิลด์ที่ไฮไลต์แสดงถึงที่อยู่ IP ที่ไปป์ไลน์ Vertex AI ใช้จากไฟล์แนบเครือข่าย PSC
15. การตรวจสอบ Cloud Logging
งาน Vertex AI Pipelines จะใช้เวลาประมาณ 14 นาทีในการเรียกใช้ครั้งแรก ส่วนการเรียกใช้ครั้งต่อๆ ไปจะใช้เวลาน้อยกว่ามาก หากต้องการตรวจสอบว่าผลลัพธ์เป็นไปตามที่ต้องการ ให้ทำดังนี้
ไปที่ Vertex AI → การฝึก → งานที่กำหนดเอง
เลือกงานที่กำหนดเองที่ดำเนินการ
เลือกดูบันทึก
เมื่อ Cloud Logging พร้อมใช้งานแล้ว ให้เลือก "เรียกใช้การค้นหา" ซึ่งจะสร้างการเลือกที่ไฮไลต์ไว้ด้านล่างเพื่อยืนยันว่า wget จาก Vertex AI Pipelines ไปยัง class-e-vm สำเร็จ
16. การตรวจสอบความถูกต้องของ TCPDump
มาดูเอาต์พุต TCPDUMP ที่ตรวจสอบการเชื่อมต่อกับอินสแตนซ์ Compute เพิ่มเติมกัน
จาก proxy-vm ให้สังเกต HTTP GET และ 200 OK
03:05:34.778574 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778946 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.778974 ens4 Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781999 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906678 ens4 In IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
จาก class-e-vm ให้สังเกต HTTP GET และ 200 OK
03:05:34.778768 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0 03:05:34.778819 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0 03:05:34.781815 ens4 In IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP 03:05:34.781856 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0 03:05:34.906503 ens4 Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK
17. ล้างข้อมูล
ลบคอมโพเนนต์ของบทแนะนำจาก Cloud Shell
gcloud compute instances delete proxy-vm --zone=us-central1-a --quiet
gcloud compute instances delete workbench-tutorial --zone=us-central1-a --quiet
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet
gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet
gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet
gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns record-sets delete proxy-vm.demo.com --zone=private-dns-codelab --type=A
gcloud dns managed-zones delete private-dns-codelab
gcloud compute networks delete consumer-vpc --quiet
18. ขอแสดงความยินดี
ขอแสดงความยินดี คุณกำหนดค่าและตรวจสอบอินเทอร์เฟซ Private Service Connect กับ Vertex AI Pipelines เรียบร้อยแล้ว
คุณสร้างโครงสร้างพื้นฐานของผู้บริโภค และเพิ่มไฟล์แนบเครือข่ายที่อนุญาตให้ผู้ผลิตสร้าง VM แบบหลาย NIC เพื่อเชื่อมต่อการสื่อสารระหว่างผู้บริโภคและผู้ผลิต คุณได้เรียนรู้วิธีสร้างการเพียร์ DNS ขณะติดตั้งใช้งานพร็อกซีที่ชัดเจนในเครือข่าย VPC ของผู้ใช้ที่อนุญาตการเชื่อมต่อกับอินสแตนซ์ VM ของคลาส E ซึ่งกำหนดเส้นทางจาก Vertex โดยตรงไม่ได้
Cosmopup คิดว่าบทแนะนำนั้นยอดเยี่ยมมาก!!
สิ่งต่อไปที่ควรทำ
อ่านเพิ่มเติมและวิดีโอ
เอกสารอ้างอิง
- ภาพรวมการเข้าถึงเครือข่าย Vertex AI | Google Cloud
- เกี่ยวกับการเข้าถึงบริการ Vertex AI ผ่านอินเทอร์เฟซ Private Service Connect | Google Cloud
- ใช้อินเทอร์เฟซ Private Service Connect สำหรับการฝึก Vertex AI | Google Cloud
- ตั้งค่าอินเทอร์เฟซ Private Service Connect สำหรับทรัพยากร Vertex AI | Google Cloud