พร็อกซีที่ชัดเจนของอินเทอร์เฟซ PSC ของ Vertex AI Pipelines

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 จัดการโดยตรง

476f87a96f153b95.png

ข้อควรพิจารณาเกี่ยวกับ 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

782ba8f1f3c3f522.png

คุณจะสร้าง psc-network-attachment รายการเดียวใน VPC ของผู้ใช้โดยใช้ประโยชน์จากการเพียร์ DNS เพื่อแก้ไข VM ของผู้ใช้ในโปรเจ็กต์ผู้เช่าที่โฮสต์ Vertex AI Training ซึ่งจะส่งผลให้เกิดกรณีการใช้งานต่อไปนี้

  1. ติดตั้งใช้งาน Vertex AI Pipelines และกำหนดค่า VM พร็อกซีให้ทำหน้าที่เป็นพร็อกซีที่ชัดเจน ซึ่งจะช่วยให้ดำเนินการ wget กับ VM ในซับเน็ตคลาส E ได้

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างการเชื่อมต่อเครือข่าย
  • วิธีที่โปรดิวเซอร์ใช้การเชื่อมต่อเครือข่ายเพื่อสร้างอินเทอร์เฟซ PSC
  • วิธีสร้างการสื่อสารจากผู้ผลิตไปยังผู้บริโภคโดยใช้การ Peering ของ DNS
  • วิธีสร้างการสื่อสารไปยังพื้นที่ที่อยู่ IP ที่ไม่ใช่ rfc1918 จาก Vertex AI Pipelines

สิ่งที่คุณต้องมี

โปรเจ็กต์ Google Cloud

สิทธิ์ IAM

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

e191e54a103d2222.png

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 ที่ใช้ในบทแนะนำ

ในบทแนะนำ บัญชีบริการจะมีบทบาทต่อไปนี้

สร้างบัญชีบริการภายใน 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

  1. ในคอนโซล Google Cloud ให้ไปที่แท็บอินสแตนซ์ในหน้า Vertex AI Workbench
  2. คลิกเปิด JupyterLab ข้างชื่ออินสแตนซ์ Vertex AI Workbench (workbench-tutorial) อินสแตนซ์ Vertex AI Workbench จะเปิดขึ้นใน JupyterLab
  3. เลือกไฟล์ > ใหม่ > Notebook
  4. เลือก 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)

f47150235fedb8ce.png

ฟิลด์ที่ไฮไลต์แสดงถึงที่อยู่ IP ที่ไปป์ไลน์ Vertex AI ใช้จากไฟล์แนบเครือข่าย PSC

39e7b251aeb4f191.png

15. การตรวจสอบ Cloud Logging

งาน Vertex AI Pipelines จะใช้เวลาประมาณ 14 นาทีในการเรียกใช้ครั้งแรก ส่วนการเรียกใช้ครั้งต่อๆ ไปจะใช้เวลาน้อยกว่ามาก หากต้องการตรวจสอบว่าผลลัพธ์เป็นไปตามที่ต้องการ ให้ทำดังนี้

ไปที่ Vertex AI → การฝึก → งานที่กำหนดเอง

เลือกงานที่กำหนดเองที่ดำเนินการ

a9be0395c842aa6f.png

เลือกดูบันทึก

53e30765ba5827f3.png

เมื่อ Cloud Logging พร้อมใช้งานแล้ว ให้เลือก "เรียกใช้การค้นหา" ซึ่งจะสร้างการเลือกที่ไฮไลต์ไว้ด้านล่างเพื่อยืนยันว่า wget จาก Vertex AI Pipelines ไปยัง class-e-vm สำเร็จ

f2c5d9fdf5cc8bed.png

3b3788603bb433ee.png

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 คิดว่าบทแนะนำนั้นยอดเยี่ยมมาก!!

c911c127bffdee57.jpeg

สิ่งต่อไปที่ควรทำ

อ่านเพิ่มเติมและวิดีโอ

เอกสารอ้างอิง