Private Service Connect: การใช้ Private Service Connect เพื่อเผยแพร่และใช้บริการด้วย Cloud Run

เกี่ยวกับ Codelab นี้
schedule61 นาที
subjectอัปเดตล่าสุดเมื่อ 28 มีนาคม 2568
account_circleเขียนโดย Lorin Price

Private Service Connect (PSC) เป็นความสามารถของเครือข่าย Google Cloud ที่ช่วยให้ผู้บริโภคเข้าถึงบริการที่มีการจัดการแบบส่วนตัวจากภายในเครือข่าย VPC ได้ ในทำนองเดียวกัน ฟีเจอร์นี้ยังช่วยให้ผู้ผลิตบริการที่มีการจัดการโฮสต์บริการเหล่านี้ในเครือข่าย VPC แยกต่างหากของตนเองและมอบการเชื่อมต่อส่วนตัวแก่ผู้บริโภคได้

Cloud Run เป็นแพลตฟอร์มการประมวลผลที่มีการจัดการซึ่งช่วยให้คุณเรียกใช้คอนเทนเนอร์บนโครงสร้างพื้นฐานที่ปรับขนาดได้ของ Google ได้โดยตรง

คุณสามารถใช้ Cloud Run เป็นบริการ PSC ได้ 2 วิธี

  1. ผ่าน PSC สำหรับ Google APIs โดยการเรียกใช้ Cloud Run ผ่าน URL run.app ที่ Cloud Run มีให้
  2. ผ่านบริการ 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

455a040761a8fab9.png

ในโค้ดแล็บนี้ คุณจะติดตั้งใช้งานบริการ 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. การตั้งค่าและข้อกําหนด

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะซ้ำกันไม่ได้ในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าอุปกรณ์พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้จะไม่เสียค่าใช้จ่ายมากนัก หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณลบทรัพยากรที่สร้างไว้หรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่ม Cloud Shell

แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 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