1. บทนำ
Private Service Connect (PSC) เป็นความสามารถของเครือข่าย Google Cloud ที่ช่วยให้ผู้บริโภคเข้าถึงบริการที่มีการจัดการแบบส่วนตัวจากภายในเครือข่าย VPC ได้ ในทำนองเดียวกัน ฟีเจอร์นี้ยังช่วยให้ผู้ผลิตบริการที่มีการจัดการโฮสต์บริการเหล่านี้ในเครือข่าย VPC แยกต่างหากของตนเองและมอบการเชื่อมต่อส่วนตัวแก่ผู้บริโภคได้
Cloud Run เป็นแพลตฟอร์มการประมวลผลที่มีการจัดการซึ่งช่วยให้คุณเรียกใช้คอนเทนเนอร์บนโครงสร้างพื้นฐานที่ปรับขนาดได้ของ Google ได้โดยตรง
คุณสามารถใช้ Cloud Run เป็นบริการ PSC ได้ 2 วิธี
- ผ่าน PSC สำหรับ Google APIs โดยการเรียกใช้ Cloud Run ผ่าน URL run.app ที่ Cloud Run มีให้
- ผ่านบริการ PSC Producer ที่กําหนดเองซึ่งแสดง Cloud Run ผ่านไฟล์แนบบริการผ่านตัวจัดสรรภาระงานแอปพลิเคชันภายในที่มี NEG แบบ Serverless
Codelab นี้จะอธิบายวิธีตั้งค่า Cloud Run ด้วย PSC สำหรับทั้ง 2 สถานการณ์
สิ่งที่คุณจะได้เรียนรู้
- การปรับใช้แอปพื้นฐานใน Cloud Run
- การควบคุมการรับส่งข้อมูลขาเข้าและขาออกของ Cloud Run
- การปรับใช้ Cloud Run ผ่านตัวจัดสรรภาระงานแอปพลิเคชันภายในที่มี NEG แบบ Serverless
- การตั้งค่าบริการ PSC Producer ผ่านไฟล์แนบบริการ
- การติดตั้งใช้งานปลายทาง PSC
สิ่งที่ต้องมี
- โปรเจ็กต์ Google Cloud ที่มีสิทธิ์ระดับเจ้าของ
2. โทโพโลยีของ Codelab
ในโค้ดแล็บนี้ คุณจะติดตั้งใช้งานบริการ Cloud Run 2 รายการที่เข้าถึงได้ผ่าน PSC โดยบริการแรกเป็นบริการที่เผยแพร่แบบกำหนดเองที่มี PSC และบริการที่ 2 เป็น PSC สำหรับ Google API คุณจะต้องสร้าง VPC 2 รายการ ได้แก่ consumer-vpc และ producer-vpc ก่อนอื่นคุณจะทําให้บริการ Hello World บน Cloud Run พร้อมใช้งานและเข้าถึงได้ผ่านตัวจัดสรรภาระงานแอปพลิเคชันภายในระดับภูมิภาคและ NEG แบบ Serverless ใน producer-vpc คุณจะยืนยันได้ว่าบริการทํางานผ่านโหลดบาลานเซอร์ผ่านไคลเอ็นต์ผู้ผลิตก่อนที่จะตั้งค่าบริการ Cloud Run ให้เข้าถึงได้ในฐานะบริการผู้ผลิต PSC ผ่านไฟล์แนบบริการ
ในส่วน consumer-vpc คุณจะนำปลายทาง PSC ไปติดตั้งใช้งานโดยชี้ไปยังไฟล์แนบบริการ Cloud Run ที่เราตั้งค่าไว้ใน producer-vpc จากนั้นคุณจะยืนยันว่าเข้าถึงบริการผ่าน PSC จากไคลเอ็นต์ฝั่งผู้บริโภคใน VPC ฝั่งผู้บริโภคได้ ถัดไป คุณจะต้องสร้างบริการ Cloud Run อีกรายการที่เรียกใช้ปลายทาง PSC สุดท้าย คุณจะนำปลายทาง PSC ไปใช้กับ Google API จากไคลเอ็นต์ฝั่งผู้บริโภค คุณจะเข้าถึง Cloud Run ผ่าน URL ที่ Cloud Run มีให้ ซึ่งจะใช้ PSC สำหรับปลายทาง Google APIs
3. การตั้งค่าและข้อกําหนด
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะซ้ำกันไม่ได้ในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าอุปกรณ์พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้จะไม่เสียค่าใช้จ่ายมากนัก หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณลบทรัพยากรที่สร้างไว้หรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่ม Cloud Shell
แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้
เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานบน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพเครือข่ายและการรับรองได้อย่างมีประสิทธิภาพ คุณทํางานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร
4. ก่อนเริ่มต้น
เปิดใช้ API
ใน Cloud Shell ให้ตรวจสอบว่าได้ตั้งค่าโปรเจ็กต์และกำหนดค่าตัวแปรแล้ว
gcloud auth login gcloud config list project gcloud config set project [YOUR-PROJECT-ID] export projectid=[YOUR-PROJECT-ID] export projectnum=[YOUR-PROJECT-NUM] export region=us-central1 export zone=us-central1-a echo $projectid echo $projectnum echo $region echo $zone
เปิดใช้บริการที่จำเป็นทั้งหมด
gcloud services enable compute.googleapis.com gcloud services enable run.googleapis.com gcloud services enable servicedirectory.googleapis.com gcloud services enable dns.googleapis.com gcloud services enable cloudbuild.googleapis.com gcloud services enable cloudresourcemanager.googleapis.com
5. สร้างเครือข่าย VPC ของผู้ผลิต
เครือข่าย VPC
จาก Cloud Shell
gcloud compute networks create producer-vpc --subnet-mode custom
สร้างซับเน็ต
จาก Cloud Shell
gcloud compute networks subnets create producer-subnet \ --network=producer-vpc \ --range=10.0.0.0/28 \ --region=$region gcloud compute networks subnets create lb-proxy-subnet \ --network=producer-vpc \ --range=10.100.100.0/24 \ --region=$region \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE gcloud compute networks subnets create psc-nat-subnet \ --network=producer-vpc \ --region=$region \ --range=10.100.101.0/24 \ --purpose=PRIVATE_SERVICE_CONNECT
ระบบจะเชื่อมโยงซับเน็ต PSC กับไฟล์แนบบริการ PSC เพื่อวัตถุประสงค์ในการเปลี่ยนค่าที่อยู่เครือข่าย สำหรับกรณีการใช้งานจริง คุณจะต้องปรับขนาดซับเน็ตนี้ให้เหมาะสมเพื่อรองรับจำนวนอุปกรณ์ปลายทางที่แนบอยู่ ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบการปรับขนาดซับเน็ต NAT ของ PSC
สร้างนโยบายไฟร์วอลล์และกฎไฟร์วอลล์ของเครือข่ายผู้ผลิต
จาก Cloud Shell
gcloud compute network-firewall-policies create producer-vpc-policy --global gcloud compute network-firewall-policies associations create \ --firewall-policy producer-vpc-policy \ --network producer-vpc \ --name network-producer-vpc \ --global-firewall-policy
หากต้องการอนุญาตให้ IAP เชื่อมต่อกับอินสแตนซ์ VM ให้สร้างกฎไฟร์วอลล์ที่มีลักษณะดังนี้
- มีผลกับอินสแตนซ์ VM ทั้งหมดที่คุณต้องการเข้าถึงโดยใช้ IAP
- อนุญาตการรับส่งข้อมูลขาเข้าจากช่วง IP 35.235.240.0/20 ช่วงนี้มีที่อยู่ IP ทั้งหมดที่ IAP ใช้สำหรับการส่งต่อ TCP
จาก Cloud Shell
gcloud compute network-firewall-policies rules create 1000 \ --action ALLOW \ --firewall-policy producer-vpc-policy \ --description "SSH with IAP" \ --direction INGRESS \ --src-ip-ranges 35.235.240.0/20 \ --layer4-configs tcp:22 \ --global-firewall-policy
6. สร้าง Hello World บน Cloud Run
ทำตามวิธีการที่นี่เพื่อเขียนตัวอย่างแอปพลิเคชันใน Python เรียกใช้คําสั่งเหล่านี้ใน Cloud Shell หลังจากทำขั้นตอนที่ 3 ใน "เขียนแอปพลิเคชันตัวอย่าง" เสร็จแล้ว ให้กลับไปที่ Codelab นี้และทำตามวิธีการด้านล่างเพื่อทำให้ใช้งานได้ใน Cloud Run จากแหล่งที่มา
ก่อนทำให้บริการ Cloud Run ใช้งานได้ ให้ตรวจสอบว่าบัญชีบริการ Compute เริ่มต้นมีสิทธิ์ที่เหมาะสมโดยเรียกใช้คําสั่งต่อไปนี้
จาก Cloud Shell
gcloud projects add-iam-policy-binding $projectid --member=serviceAccount:$projectnum-compute@developer.gserviceaccount.com --role=roles/run.builder
หมายเหตุ: โค้ดแล็บนี้ถือว่าองค์กรของคุณไม่ได้เปิดใช้นโยบายองค์กรการแชร์ที่จำกัดโดเมน หากเปิดใช้นโยบายนี้ คุณจะต้องทําตามขั้นตอนเพิ่มเติมเพื่อทําให้ Cloud Run พร้อมใช้งานด้วยการตรวจสอบสิทธิ์ การกำหนดค่าหน้าจอความยินยอม OAuth และตั้งค่า IAP สําหรับแบ็กเอนด์ของโปรแกรมโหลดบาลานซ์ เราขอแนะนำให้ทำตามขั้นตอนการกำหนดค่าทั้งหมดเหล่านี้ในสภาพแวดล้อมจริง
จาก Cloud Shell
gcloud beta run deploy helloworld \ --source . \ --platform=managed \ --ingress=internal \ --allow-unauthenticated \ --no-default-url \ --region=$region
การใช้ Flag --no-default-url
จะทําให้ระบบทําให้บริการ Cloud Run ใช้งานได้โดยไม่มี URL run.app ที่ระบุ เราจะไม่ใช้ URL นี้กับบริการนี้ ขณะเผยแพร่โค้ดแล็บนี้ ฟีเจอร์นี้ยังอยู่ในเวอร์ชันตัวอย่าง
ก่อนดำเนินการต่อ ให้เปลี่ยนกลับไปที่ไดเรกทอรีหลักของ Cloud Shell
จาก Cloud Shell
cd ..
7. แสดง Hello World Cloud Run ผ่านตัวจัดสรรภาระงานแอปพลิเคชันภายใน
สำรองที่อยู่ IP ภายในแบบคงที่สำหรับกฎการส่งต่อของตัวจัดสรรภาระงาน
ใน Cloud Shell
gcloud compute addresses create cloudrun-ip \ --region=$region \ --subnet=producer-subnet gcloud compute addresses describe cloudrun-ip --region=$region
ตัวอย่างเอาต์พุต
address: 10.0.1.31 addressType: INTERNAL creationTimestamp: '2025-03-17T09:04:06.620-07:00' description: '' id: 'xxxx' kind: compute#address labelFingerprint: xxxx name: cloudrun-ip networkTier: PREMIUM purpose: GCE_ENDPOINT region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/addresses/cloudrun-ip status: RESERVED subnetwork: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/producer-subnet
จดที่อยู่ IP ที่คุณเพิ่งสร้างขึ้น
สร้างตัวจัดสรรภาระงานแอปพลิเคชันภายในระดับภูมิภาค
ใน Cloud Shell
gcloud compute network-endpoint-groups create cloudrun-producer-neg \ --region=$region \ --network-endpoint-type=serverless \ --cloud-run-service=helloworld gcloud compute backend-services create cloudrun-producer-bes \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=HTTP \ --region=$region gcloud compute backend-services add-backend cloudrun-producer-bes \ --region=$region \ --network-endpoint-group=cloudrun-producer-neg \ --network-endpoint-group-region=$region gcloud compute url-maps create producer-urlmap \ --default-service=cloudrun-producer-bes \ --region=$region gcloud compute target-http-proxies create producer-http-proxy \ --url-map=producer-urlmap \ --region=$region
ใน Cloud Shell
gcloud compute forwarding-rules create cloudrun-fr \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=producer-vpc \ --subnet=producer-subnet \ --address=cloudrun-ip \ --target-http-proxy=producer-http-proxy \ --target-http-proxy-region=$region \ --region=$region \ --ports=80 \ --allow-global-access
8. ทดสอบ Hello World Cloud Run ที่แสดงผ่านตัวจัดสรรภาระงาน
สร้าง VM ทดสอบ
จาก Cloud Shell
gcloud compute instances create producer-client \ --zone=$zone \ --subnet=producer-subnet \ --no-address \ --scopes=cloud-platform
ใน Cloud Shell
gcloud compute ssh \ --zone "$zone" "producer-client" \ --tunnel-through-iap \ --project $projectid
แทนที่ <loadbalancer-ip> ด้วยที่อยู่ IP ที่คุณสร้างขึ้นก่อนหน้านี้ (เช่น 10.0.0.2)
ทดสอบ Hello World
ใน producer-vm
curl <loadbalancer-ip>
ผลลัพธ์ที่คาดหวัง
Hello World!
ออกจาก VM
ใน producer-vm
exit
9. สร้างไฟล์แนบบริการ
จาก Cloud Shell
gcloud compute service-attachments create cloudrun-attachment \ --region=$region \ --producer-forwarding-rule=cloudrun-fr \ --connection-preference=ACCEPT_MANUAL \ --consumer-accept-list=$projectid=5 \ --nat-subnets=psc-nat-subnet
ถัดไป ให้เรียกข้อมูล URI ของไฟล์แนบบริการและจดบันทึกไว้เพื่อกำหนดค่าปลายทาง PSC ในสภาพแวดล้อมของผู้บริโภค
ใน Cloud Shell
gcloud compute service-attachments describe cloudrun-attachment --region=$region
ตัวอย่างผลลัพธ์ที่คาดหวัง
connectionPreference: ACCEPT_MANUAL consumerAcceptLists: - connectionLimit: 5 projectIdOrNum: $projectid creationTimestamp: '2025-03-10T08:49:08.134-07:00' description: '' enableProxyProtocol: false fingerprint: -F0Kpe3Fi8o= id: '2679595584727463707' kind: compute#serviceAttachment name: cloudrun-attachment natSubnets: - https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/psc-nat-subnet pscServiceAttachmentId: high: 'xxxxx' low: 'xxxx' reconcileConnections: false region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/serviceAttachments/cloudrun-attachment targetService: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$projectid/forwardingRules/cloudrun-fr
10. สร้างเครือข่าย VPC ของผู้บริโภค
เครือข่าย VPC
จาก Cloud Shell
gcloud compute networks create consumer-vpc --subnet-mode custom
สร้างซับเน็ต
จาก Cloud Shell
gcloud compute networks subnets create consumer-subnet \ --network=consumer-vpc \ --range=10.0.0.0/24 \ --region=$region \ --enable-private-ip-google-access gcloud compute networks subnets create cloudrun-egress \ --network=consumer-vpc \ --range=10.0.1.0/24 \ --region=$region \ --enable-private-ip-google-access
สร้าง Cloud NAT
จาก Cloud Shell
gcloud compute routers create central-cr \ --network=consumer-vpc \ --region=$region gcloud compute routers nats create central-nat \ --router=central-cr \ --region=$region \ --nat-all-subnet-ip-ranges \ --auto-allocate-nat-external-ips
สร้างนโยบายไฟร์วอลล์และกฎไฟร์วอลล์ของเครือข่ายผู้บริโภค
เราจะสร้างนโยบายไฟร์วอลล์เครือข่ายอีกรายการสำหรับ consumer-vpc
จาก Cloud Shell
gcloud compute network-firewall-policies create consumer-vpc-policy --global gcloud compute network-firewall-policies associations create --firewall-policy consumer-vpc-policy --network consumer-vpc --name network-consumer-vpc --global-firewall-policy gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy consumer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22 --global-firewall-policy
11. สร้างปลายทาง PSC สำหรับบริการ Hello World บน Cloud Run
ณ จุดนี้ เราจะสร้างปลายทาง PSC และเชื่อมต่อกับบริการ Cloud Run ที่คุณเปิดเผยผ่านไฟล์แนบบริการ คุณจะใช้ URI ไฟล์แนบบริการที่บันทึกไว้ก่อนหน้านี้ในส่วนนี้ ตรวจสอบว่ารูปแบบของ URI ในคําสั่ง gcloud ตรงกับ URI ของคุณ
สร้างปลายทาง PSC
จาก Cloud Shell
gcloud compute addresses create cloudrun-service-ip --region=$region --subnet=consumer-subnet --ip-version=IPV4 gcloud compute forwarding-rules create cloudrun-ep --region=$region --network=consumer-vpc --address=cloudrun-service-ip --target-service-attachment=projects/$projectid/regions/$region/serviceAttachments/cloudrun-attachment
รับที่อยู่ IP ของปลายทาง PSC ที่คุณเพิ่งสร้างขึ้น คุณจะใช้ที่อยู่ IP ในขั้นตอนถัดไปเพื่อทดสอบอุปกรณ์ปลายทาง
จาก Cloud Shell
gcloud compute addresses list --filter="name=cloudrun-service-ip"
ตัวอย่างผลลัพธ์ที่คาดหวัง
NAME: cloudrun-service-ip ADDRESS/RANGE: 10.0.0.2 TYPE: INTERNAL PURPOSE: GCE_ENDPOINT NETWORK: REGION: us-central1 SUBNET: consumer-subnet STATUS: IN_USE
12. สร้าง VM ของไคลเอ็นต์ผู้บริโภคและทดสอบการเชื่อมต่อกับอุปกรณ์ปลายทาง
สร้าง VM สำหรับไคลเอ็นต์ผู้บริโภค
จาก Cloud Shell
gcloud compute instances create consumer-client \ --zone=$zone \ --subnet=consumer-subnet \ --no-address \ --metadata startup-script='#! /bin/bash sudo apt-get update sudo apt-get install dnsutils -y'
ทดสอบการเชื่อมต่อ
จาก Cloud Shell
gcloud compute ssh \ --zone "$zone" "consumer-client" \ --tunnel-through-iap \ --project $projectid
แทนที่ <cloudrun-service-ip> ด้วยที่อยู่ IP จริง
จาก VM ของผู้บริโภค
curl <cloudrun-service-ip>
ผลลัพธ์ที่คาดหวัง
Hello World!
จาก VM ของไคลเอ็นต์ผู้บริโภค
exit
13. สร้างบริการ Loop ของ Cloud Run
ต่อไปเราจะสร้างบริการ Cloud Run ที่จะเรียกกลับไปยัง consumer-vpc แบบส่วนตัวเพื่อเรียกใช้บริการ HelloWorld ของ Cloud Run ก่อนหน้านี้ที่เราแสดงผ่าน PSC
ทำตามวิธีการ "เขียนแอปพลิเคชันตัวอย่าง" ที่นี่เพื่อเขียนแอปพลิเคชันวนซ้ำใน PHP แทนที่จะตั้งชื่อไดเรกทอรีว่า helloworld-php ให้ตั้งชื่อเป็น cloudrun-loop เรียกใช้คําสั่งเหล่านี้ใน Cloud Shell ในขั้นตอนที่ 2 ให้ใช้โค้ด PHP ด้านล่างในไฟล์ index.php กลับไปที่โค้ดแล็บเมื่อคุณพร้อมที่จะทําให้ใช้งานได้ใน Cloud Run อย่าทำตามวิธีการในเอกสารประกอบสำหรับขั้นตอนนี้
ใช้โค้ดนี้กับไฟล์ index.php แทนที่ <cloudrun-service-ip> ด้วยที่อยู่ IP ของปลายทาง PSC ที่คุณทดสอบในขั้นตอนก่อนหน้า
จาก Cloud Shell
<?php if(!function_exists('curl_init')) { die('cURL not available!'); } $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://<cloudrun-service-ip>/'); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($curl); if ($output === FALSE) { echo 'An error has occurred: ' . curl_error($curl) . PHP_EOL; } else { echo $output; } ?>
เรากําหนดเครือข่ายและซับเน็ตในการติดตั้งใช้งาน Cloud Run นี้เนื่องจากการรับส่งข้อมูล Cloud Run ต้องออกไปยัง VPC อีกครั้งเพื่อเข้าถึงปลายทาง PSC เรากําลังกําหนดให้ Cloud Run ใช้ซับเน็ต cloudrun-egress สําหรับการส่งออก VPC โดยตรง เราจะกําหนดเส้นทางการรับส่งข้อมูลทั้งหมดให้ออกผ่านซับเน็ตขาออก VPC โดยตรงกลับไปยัง VPC
จาก Cloud Shell
gcloud run deploy cloudrun-loop \ --source . \ --platform=managed \ --ingress=internal \ --allow-unauthenticated \ --vpc-egress=all-traffic \ --network=consumer-vpc \ --subnet=cloudrun-egress \ --region=$region
เมื่อบริการ Cloud Run ติดตั้งใช้งานเสร็จแล้ว ระบบจะแสดง URL ของบริการในรูปแบบ https://cloudrun-loop-<projectnum>.<region>.run.app โปรดจดบันทึก URL นี้ไว้ด้วยเพื่อนำไปทดสอบในขั้นตอนถัดไป
14. ทดสอบการเชื่อมต่อกับ CloudRun-Loop ผ่าน URL ของ Cloud Run
จาก Cloud Shell
gcloud compute ssh \ --zone "$zone" "consumer-client" \ --tunnel-through-iap \ --project $projectid
แทนที่ <Cloud-Run-ServiceURL> ด้วย URL ของบริการที่คุณจดไว้ก่อนหน้านี้
จาก VM ของไคลเอ็นต์ผู้บริโภค
curl <Cloud-Run-ServiceURL>
ผลลัพธ์ที่คาดหวัง
Hello World!
ผลลัพธ์นี้แสดงให้เห็นว่าบริการ CloudRun-Loop เรียกกลับไปยัง consumer-vpc เพื่อเรียกใช้ปลายทาง PSC ที่เชื่อมต่อกับบริการ Hello World Cloud Run ของเราได้สําเร็จ อย่างไรก็ตาม ณ จุดนี้ VM ของไคลเอ็นต์ผู้บริโภคจะออกไปยังอินเทอร์เน็ตผ่าน Cloud NAT เพื่อเรียกใช้ URL สาธารณะของ Cloud Run เราเรียกใช้ dig ใน URL เพื่อแสดงว่า URL จะแก้ไขเป็นที่อยู่ IP สาธารณะ
จาก VM ของไคลเอ็นต์ผู้บริโภค
dig <Cloud-Run-ServiceURL>
ตัวอย่างเอาต์พุต
; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> https://cloudrun-loop-<projectnum>.<region>.run.app ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1938 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;https://cloudrun-loop-<projectnum>.<region>.run.app. IN A ;; ANSWER SECTION: https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.38.53 https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.36.53 https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.32.53 https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.34.53 ;; Query time: 4 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Tue Mar 11 19:05:36 UTC 2025 ;; MSG SIZE rcvd: 147
เราสามารถสร้าง PSC สำหรับปลายทาง Google APIs เพื่อเปลี่ยนการแก้ปัญหานี้เป็นแบบส่วนตัวเพื่อไม่ให้การรับส่งข้อมูลผ่านอินเทอร์เน็ตสาธารณะ
จาก VM ของไคลเอ็นต์ผู้บริโภค
exit
15. สร้าง PSC สําหรับปลายทาง Google APIs
อุปกรณ์ปลายทาง PSC นี้แตกต่างจากที่เราสร้างขึ้นก่อนหน้านี้ PSC สำหรับ Google API จะชี้ไปยังกลุ่ม Google API (API ทั้งหมดหรือ API ที่เข้ากันได้กับ VPC-SC) ที่อยู่ IP ไม่ได้มาจากซับเน็ตระดับภูมิภาค แต่สร้างขึ้นเป็นที่อยู่ IP /32 เดียวที่เป็นแบบทั่วโลก ซึ่งต้องไม่ซ้อนทับกับซับเน็ต VPC ที่มีอยู่ ซับเน็ต VPC ที่เชื่อมต่อแบบเพียร์ หรือเส้นทางแบบผสม
จาก Cloud Shell
export pscgoogip=100.100.100.100 echo $pscgoogip gcloud compute addresses create psc-goog-ep-ip \ --global \ --purpose=PRIVATE_SERVICE_CONNECT \ --addresses=$pscgoogip \ --network=consumer-vpc
จาก Cloud Shell
gcloud compute forwarding-rules create psc4googapi \ --global \ --network=consumer-vpc \ --address=psc-goog-ep-ip \ --target-google-apis-bundle=all-apis
16. สร้างโซนส่วนตัว Cloud DNS สำหรับ run.app
เมื่อสร้าง PSC สำหรับปลายทาง Google API ระบบจะสร้างโซน DNS ส่วนตัวของ Cloud Run สำหรับ API ทั้งหมดที่อยู่ภายใต้โดเมน googleapis.com เนื่องจาก Cloud Run ใช้ run.app เราจึงต้องสร้างโซนส่วนตัวอีกโซนเพื่อแมป run.app กับ PSC สำหรับปลายทาง Google APIs
จาก Cloud Shell
gcloud dns managed-zones create "cloudrun" \ --dns-name=run.app \ --description="run.app psc resolution" \ --visibility=private \ --networks=consumer-vpc gcloud dns record-sets transaction start \ --zone="cloudrun" gcloud dns record-sets transaction add $pscgoogip \ --name=*.run.app \ --ttl=300 \ --type=A \ --zone="cloudrun" gcloud dns record-sets transaction execute \ --zone="cloudrun"
17. ทดสอบการแปลง DNS ส่วนตัว
เราจะเข้าสู่ระบบ VM ของลูกค้าอีกครั้งและเรียกใช้ dig อีกครั้ง และตอนนี้เราควรจะเห็นว่า URL ของ Cloud Run จะแก้ไขเป็น PSC สำหรับปลายทาง Google APIs
จาก Cloud Shell
gcloud compute ssh \ --zone "$zone" "consumer-client" \ --tunnel-through-iap \ --project $projectid
ก่อนอื่น เราจะล้างแคช DNS แทนที่ <Cloud-Run-ServiceURL> ด้วย URL ของบริการที่คุณจดไว้ก่อนหน้านี้
จาก VM ของไคลเอ็นต์ผู้บริโภค
sudo resolvectl flush-caches curl <CloudRun-Loop-ServiceURL>
Curl ควรยังคงทํางานตามที่เห็นก่อนหน้านี้
จาก VM ของไคลเอ็นต์ผู้บริโภค
curl <CloudRun-Loop-ServiceURL>
ผลลัพธ์ที่คาดหวัง
Hello World!
จาก VM ของไคลเอ็นต์ผู้บริโภค
dig <CloudRun-Loop-ServiceURL>
คำสั่ง dig ควรแสดงว่าตอนนี้บริการ Cloud Run Loop ของเรากำลังแก้ไข PSC สำหรับปลายทาง Google APIs
ตัวอย่างเอาต์พุต
; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> https://cloudrun-loop-<projectnum>.<region>.run.app ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30179 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;https://cloudrun-loop-<projectnum>.<region>.run.app. IN A ;; ANSWER SECTION: https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 100.100.100.100 ;; Query time: 8 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Tue Mar 11 20:04:05 UTC 2025 ;; MSG SIZE rcvd: 99
สำเร็จ
18. ขั้นตอนการล้างข้อมูล
ออกจากอินสแตนซ์ VM
exit
จาก Cloud Shell
gcloud dns record-sets delete *.run.app --zone="cloudrun" --type=A -q gcloud dns managed-zones delete "cloudrun" -q gcloud compute instances delete consumer-client --zone=$zone --project=$projectid -q gcloud compute forwarding-rules delete psc4googapi --global -q gcloud compute addresses delete psc-goog-ep-ip --global -q gcloud run services delete cloudrun-loop --region=$region -q gcloud artifacts docker images delete $region-docker.pkg.dev/$projectid/cloud-run-source-deploy/cloudrun-loop -q gcloud compute forwarding-rules delete cloudrun-ep --region=$region -q gcloud compute addresses delete cloudrun-service-ip --region=$region -q gcloud compute network-firewall-policies rules delete 1000 --firewall-policy consumer-vpc-policy --global-firewall-policy -q gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy --name=network-consumer-vpc --global-firewall-policy -q gcloud compute network-firewall-policies delete consumer-vpc-policy --global -q gcloud compute routers nats delete central-nat --router=central-cr --region=$region -q gcloud compute routers delete central-cr --region=$region -q gcloud compute networks subnets delete consumer-subnet --region $region -q
เป็นไปได้ว่าการเรียกใช้คําสั่ง 2 รายการถัดไปอาจไม่สําเร็จเนื่องจากข้อผิดพลาด "ทรัพยากรมีการใช้งาน" เอกสารประกอบของ Cloud Run ระบุว่าบางครั้ง Cloud Run อาจใช้เวลา 1-2 ชั่วโมงในการปล่อยทรัพยากรซับเน็ตหลังจากที่ลบบริการ Cloud Run แล้ว หากการลบไม่สำเร็จ ให้ข้าม 2 คำสั่งนี้และไปยังส่วนถัดไป จากนั้นกลับมาที่ส่วนนี้เพื่อลบหลังจากผ่านไประยะหนึ่ง
จาก Cloud Shell
gcloud compute networks subnets delete cloudrun-egress --region $region -q gcloud compute networks delete consumer-vpc -q
จาก Cloud Shell
gcloud compute service-attachments delete cloudrun-attachment --region=$region -q gcloud compute instances delete producer-client --zone=$zone --project=$projectid -q gcloud compute forwarding-rules delete cloudrun-fr --region=$region -q gcloud compute target-http-proxies delete producer-http-proxy --region=$region -q gcloud compute url-maps delete producer-urlmap --region=$region -q gcloud compute backend-services delete cloudrun-producer-bes --region=$region -q gcloud compute network-endpoint-groups delete cloudrun-producer-neg --region=$region -q gcloud compute addresses delete cloudrun-ip --region=$region -q gcloud run services delete helloworld --region=$region -q gcloud artifacts docker images delete $region-docker.pkg.dev/$projectid/cloud-run-source-deploy/helloworld -q gcloud artifacts repositories delete cloud-run-source-deploy --location=$region -q gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy --name=network-producer-vpc --global-firewall-policy -q gcloud compute network-firewall-policies delete producer-vpc-policy --global -q gcloud compute networks subnets delete lb-proxy-subnet --region $region -q gcloud compute networks subnets delete psc-nat-subnet --region $region -q gcloud compute networks subnets delete producer-subnet --region $region -q gcloud compute networks delete producer-vpc -q
19. ยินดีด้วย
ขอแสดงความยินดีที่ทํา Codelab จนเสร็จสมบูรณ์
สิ่งที่เราได้พูดถึง
- การปรับใช้แอปพื้นฐานใน Cloud Run
- การควบคุมการรับส่งข้อมูลขาเข้าและขาออกของ Cloud Run
- การปรับใช้ Cloud Run ผ่านตัวจัดสรรภาระงานแอปพลิเคชันภายในที่มี NEG แบบ Serverless
- การตั้งค่าบริการ PSC Producer ผ่านไฟล์แนบบริการ
- การติดตั้งใช้งานอุปกรณ์ปลายทาง PSC