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 ที่กำหนดเองซึ่ง Cloud Run จะแสดงผ่านไฟล์แนบบริการผ่านตัวจัดสรรภาระงานของแอปพลิเคชันภายในที่มี NEG แบบ Serverless
Codelab นี้จะอธิบายวิธีตั้งค่า Cloud Run ด้วย PSC สำหรับทั้ง 2 สถานการณ์
สิ่งที่คุณจะได้เรียนรู้
- การทำให้แอปพื้นฐานใช้งานได้ใน Cloud Run
- การควบคุมขาเข้าและขาออกของ Cloud Run
- การทำให้ Cloud Run ใช้งานได้ผ่าน Internal Application Load Balancer ด้วย NEG แบบ Serverless
- การตั้งค่าบริการของผู้ผลิต PSC ผ่านไฟล์แนบบริการ
- การติดตั้งใช้งานปลายทาง 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 จากไคลเอ็นต์ผู้บริโภคใน consumer-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 Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดใน Codelab นี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร
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
หมายเหตุ: Codelab นี้ถือว่าองค์กรของคุณไม่ได้เปิดใช้นโยบายขององค์กรที่จำกัดการแชร์โดเมน หากเปิดใช้นโยบายนี้ คุณจะต้องทำตามขั้นตอนเพิ่มเติมเพื่อติดตั้งใช้งาน Cloud Run ด้วยการตรวจสอบสิทธิ์ กำหนดค่าหน้าจอคำยินยอม OAuth และตั้งค่า IAP สำหรับแบ็กเอนด์ของตัวจัดสรรภาระงาน ขอแนะนำให้ทำตามขั้นตอนการกำหนดค่าทั้งหมดเหล่านี้ในสภาพแวดล้อมการผลิต
จาก Cloud Shell
gcloud beta run deploy helloworld \
--source . \
--platform=managed \
--ingress=internal \
--allow-unauthenticated \
--no-default-url \
--region=$region
การใช้แฟล็ก --no-default-url จะทำให้บริการ Cloud Run ใช้งานได้โดยไม่มี URL run.app ที่ระบุ เราจะไม่ใช้ URL สำหรับบริการนี้ ฟีเจอร์นี้ยังอยู่ในเวอร์ชันตัวอย่าง ณ วันที่เผยแพร่ Codelab นี้
ก่อนดำเนินการต่อ ให้เปลี่ยนกลับไปที่ไดเรกทอรีหลักของ Cloud Shell
จาก Cloud Shell
cd ..
7. แสดง Hello World Cloud Run ผ่าน Internal Application Load Balancer
สำรองที่อยู่ 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 ที่คุณเพิ่งสร้าง
สร้าง Application Load Balancer ภายในระดับภูมิภาค
ใน 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. สร้างบริการวนซ้ำของ Cloud Run
จากนั้นเราจะสร้างบริการ Cloud Run ที่จะโทรกลับแบบส่วนตัวไปยัง consumer-vpc เพื่อเรียกใช้บริการ Cloud Run HelloWorld ก่อนหน้าซึ่งเราเปิดเผยผ่าน PSC
ทำตามวิธีการ "เขียนแอปพลิเคชันตัวอย่าง" ที่นี่เพื่อเขียนแอปพลิเคชันลูปใน PHP ตั้งชื่อไดเรกทอรีเป็น cloudrun-loop แทน helloworld-php เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell ในขั้นตอนที่ 2 ให้ใช้โค้ด PHP ด้านล่างในไฟล์ index.php กลับไปที่ Codelab เมื่อพร้อมที่จะติดตั้งใช้งานใน 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. ทดสอบการเชื่อมต่อกับ Cloud Run โดยวนซ้ำผ่าน 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 APIs จะชี้ไปยังชุดของ Google APIs (ไม่ว่าจะเป็น 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 ใช้งานได้ผ่าน Internal Application Load Balancer ด้วย NEG แบบ Serverless
- การตั้งค่าบริการของผู้ผลิต PSC ผ่านไฟล์แนบบริการ
- การติดตั้งใช้งานปลายทาง PSC