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

1. บทนำ

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 ที่กำหนดเองซึ่ง 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

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

เริ่มต้น Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 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