Private Service Connect - การใช้แบ็กเอนด์ PSC เพื่อเข้าถึง Google API ระดับภูมิภาค

เกี่ยวกับ Codelab นี้
schedule49 นาที
subjectอัปเดตล่าสุดเมื่อ 16 ธันวาคม 2567
account_circleเขียนโดย Veda Shridharan

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

นอกจากนี้ คุณยังใช้แบ็กเอนด์ PSC ร่วมกับตัวกระจายโหลดพร็อกซีของ Google Cloud เพื่อชี้ไปยัง Google API สำหรับภูมิภาคที่เฉพาะเจาะจงได้ การใช้แบ็กเอนด์ PSC จะให้การควบคุมฝั่งผู้บริโภคที่ละเอียดยิ่งขึ้น เช่น

  • การเลือกบริการ Google API ที่พร้อมใช้งานโดยใช้แผนที่ URL
  • ความสามารถในการสังเกตที่ละเอียดยิ่งขึ้น
  • การผสานรวม Cloud Armor
  • URL ที่กำหนดเอง
  • การจัดการการรับส่งข้อมูลขั้นสูง

ดูรายการบริการและ API ระดับภูมิภาคที่พร้อมให้บริการได้ที่นี่

ใน Codelab นี้ คุณจะได้สร้างแบ็กเอนด์ PSC ที่ชี้ไปยัง Cloud KMS API ระดับภูมิภาคและทดสอบการเชื่อมต่อกับ API ดังกล่าว

  • สร้างคีย์ริงและคีย์ Cloud Key Management Service (KMS)
  • สร้างตัวจัดสรรภาระงานแอปพลิเคชันภายในที่มีแบ็กเอนด์ PSC ที่ชี้ไปยัง API ระดับภูมิภาคของ Cloud KMS
  • การสร้างโซนส่วนตัวที่มีการจัดการของ Cloud DNS และระเบียน A
  • เข้าถึง Cloud KMS ระดับภูมิภาค

สิ่งที่ต้องมี

  • โปรเจ็กต์ Google Cloud ที่มีสิทธิ์ "เจ้าของ" หรือ "ผู้แก้ไข" แบบเต็ม

2. โทโพโลยีของ Codelab

1a18ae253213e215.png

ระบบจะสร้าง VPC ของผู้บริโภคที่มีซับเน็ต 1 รายการในภูมิภาค europe-west9 สำหรับการโฮสต์ VM, กฎการส่งต่อของตัวจัดสรรภาระงานแอปพลิเคชันระดับภูมิภาคภายใน และแบ็กเอนด์ PSC รวมถึงซับเน็ตเฉพาะพร็อกซี 1 รายการสำหรับใช้กับตัวจัดสรรภาระงาน เราจะสร้างคีย์ริงและคีย์ในระบบจัดการคีย์ (KMS) ของ Cloud ในภูมิภาคยุโรปตะวันตก จากนั้นเราจะสร้างตัวจัดสรรภาระงานและแบ็กเอนด์ PSC เพื่อแก้ไขเป็น KMS API ระดับภูมิภาคใน europe-west9

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 config list project
gcloud config set project <project-id>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=europe-west9
export ZONE=europe-west9-a
echo $PROJECT_ID
echo $REGION
echo $ZONE

เปิดใช้บริการที่จำเป็นทั้งหมด

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com
gcloud services enable cloudkms.googleapis.com

5. สร้างเครือข่าย VPC, ซับเน็ต และกฎไฟร์วอลล์

สร้างเครือข่าย VPC

จาก Cloud Shell

# Set environment variables

export VPC_NAME="consumer-vpc"
export SUBNET_NAME="consumer-subnet-1"

# Create VPC network

gcloud compute networks create ${VPC_NAME} \
    --subnet-mode=custom \
    --bgp-routing-mode=regional

สร้างซับเน็ต

จาก Cloud Shell

gcloud compute networks subnets create ${SUBNET_NAME} \
    --network=${VPC_NAME} \
    --region=${REGION} \
    --range=10.0.0.0/24 \
    --enable-private-ip-google-access

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

จาก Cloud Shell

gcloud compute networks subnets create eu-west9-proxy-subnet \
--network=${VPC_NAME} \
--region=${REGION} \
--range=10.100.100.0/24 \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE

สร้างกฎไฟร์วอลล์

ในแล็บนี้ คุณจะใช้ IAP เพื่อเชื่อมต่อกับอินสแตนซ์ที่สร้าง หากไม่ต้องการใช้ IAP ให้ข้ามขั้นตอนนี้ แล้วเพิ่มที่อยู่ IP สาธารณะในอินสแตนซ์และสร้างกฎไฟร์วอลล์ที่อนุญาตให้ใช้ข้อมูลขาเข้าบนพอร์ต TCP 22 จาก 0.0.0.0/0 แทน

หากต้องการอนุญาตให้ IAP เชื่อมต่อกับอินสแตนซ์ VM ให้สร้างกฎไฟร์วอลล์ที่มีลักษณะดังนี้

  • มีผลกับอินสแตนซ์ VM ทั้งหมดที่คุณต้องการเข้าถึงโดยใช้ IAP
  • อนุญาตการรับส่งข้อมูลขาเข้าจากช่วง IP 35.235.240.0/20 ช่วงนี้มีที่อยู่ IP ทั้งหมดที่ IAP ใช้สำหรับการส่งต่อ TCP

จาก Cloud Shell

gcloud compute firewall-rules create allow-ssh-iap \
    --network=${VPC_NAME} \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

6. สร้าง Cloud NAT

คุณต้องสร้าง Cloud NAT เพื่อดาวน์โหลดแพ็กเกจ Linux

สร้าง Cloud Router

จาก Cloud Shell

gcloud compute routers create crnat \
    --network=${VPC_NAME} \
    --region=${REGION}

สร้าง Cloud NAT

จาก Cloud Shell

gcloud compute routers nats create europe-nat \
    --router=crnat \
    --auto-allocate-nat-external-ips \
    --nat-all-subnet-ip-ranges \
    --enable-logging \
    --region=${REGION}

7. สร้างคีย์ริงและคีย์การจัดการคีย์

จาก Cloud Shell

gcloud kms keyrings create europe-kr \
    --location ${REGION}

จาก Cloud Shell

gcloud kms keys create europe-key \
    --location ${REGION} \
    --keyring europe-kr \
    --purpose encryption

จาก Cloud Shell ให้ตรวจสอบว่าสร้างพวงกุญแจและคีย์ในภูมิภาคยุโรปตะวันตกเรียบร้อยแล้ว

gcloud kms keys list \
    --location ${REGION} \
    --keyring europe-kr

ผลลัพธ์ที่คาดไว้

NAME: projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS: 
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

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

8. สร้าง VM ของไคลเอ็นต์และเชื่อมต่อกับ KMS API

ถัดไป คุณจะต้องสร้าง VM ของไคลเอ็นต์, SSH เข้าสู่ VM และทดสอบการแก้ปัญหาของ KMS API ทั่วโลก การทดสอบนี้แสดงตัวเลือกเริ่มต้นสำหรับการแก้ไข Google APIs ทั่วโลก

จาก Cloud Shell

#Create the startup script

touch startup.sh

#Open the startup.sh file using a text editor of your choice (e.g., nano, vim, gedit, etc.)

nano startup.sh 

#Paste the following script content into the startup.sh file

#! /bin/bash 
sudo apt-get update 
sudo apt-get install dnsutils -y 
sudo apt-get install tcpdump -y

#Save the changes you made to the startup.sh file
#Use the chmod command to make the script executable

chmod +x startup.sh

#Create the VM instance

gcloud compute instances create client-vm \
    --network="${VPC_NAME}" \
    --subnet="${SUBNET_NAME}" \
    --zone="europe-west9-a" \
    --machine-type="e2-medium" \
    --no-address \
    --scopes="https://www.googleapis.com/auth/cloud-platform" \
    --image-family="debian-12" \
    --image-project="debian-cloud" \
    --metadata-from-file="startup-script=./startup.sh" 

ถัดไป คุณจะต้องอัปเดตบัญชีบริการ Compute เริ่มต้นเพื่อรับสิทธิ์เข้าถึงคีย์ KMS ที่คุณสร้างขึ้น บัญชีบริการ Compute เริ่มต้นจะอยู่ในรูปแบบ <Project_Number> -compute@developer.gserviceaccount.com หากต้องการดูหมายเลขโปรเจ็กต์ ให้เรียกใช้คําสั่งต่อไปนี้จาก Cloud Shell แล้วคัดลอกหมายเลขในบรรทัดสุดท้ายของผลลัพธ์ที่แสดง

 gcloud projects describe $PROJECT_ID

อัปเดตบัญชีบริการ Compute เริ่มต้นเพื่อรับสิทธิ์เข้าถึงคีย์ KMS ที่คุณสร้างขึ้น

จาก Cloud Shell

gcloud kms keys add-iam-policy-binding europe-key \
    --location $REGION \
    --keyring europe-kr \
    --member serviceAccount:<project_number>-compute@developer.gserviceaccount.com \
    --role roles/cloudkms.admin

สร้างเทอร์มินัล Cloud Shell เพิ่มเติมโดยคลิก + (ภาพหน้าจอด้านล่าง)

a36edc967333315a.png

ในแท็บที่ 2 ให้สร้างอุโมงค์ผ่าน IAP เพื่อ SSH ไปยัง VM ของลูกค้า โปรดทราบว่าตัวแปรสภาพแวดล้อมจะไม่ส่งต่อและคุณจะต้องเพิ่มรหัสโปรเจ็กต์ลงในคําสั่งด้านล่าง

จาก Cloud Shell

# Set the environment variable

export PROJECT_ID=$(gcloud config get-value project)

# ssh into the client-vm

gcloud beta compute ssh --zone europe-west9-a "client-vm" \
--tunnel-through-iap \
--project $PROJECT_ID

เชื่อมต่อกับ KMS API ทั่วโลกโดยใช้ชื่อคีย์ KMS ที่คุณจดไว้ก่อนหน้านี้

จากแท็บ 2, client-vm

# Store the access token in a variable

TOKEN=$(gcloud auth print-access-token)

# Run the full command with maximum verbosity
curl -v \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
'https://cloudkms.googleapis.com/v1/projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key'

ผลลัพธ์ที่คาดไว้

*   Trying 216.58.214.74:443...
* Connected to cloudkms.googleapis.com (216.58.214.74) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=upload.video.google.com
*  start date: Aug 26 07:12:45 2024 GMT
*  expire date: Nov 18 07:12:44 2024 GMT
*  subjectAltName: host "cloudkms.googleapis.com" matched cert's "*.googleapis.com"
*  issuer: C=US; O=Google Trust Services; CN=WR2
*  SSL certificate verify ok.
* using HTTP/2
* h2h3 [:method: GET]
* h2h3 [:path: /v1/projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key]
* h2h3 [:scheme: https]
* h2h3 [:authority: cloudkms.googleapis.com]
* h2h3 [user-agent: curl/7.88.1]
* h2h3 [accept: */*]
* h2h3 [authorization: Bearer dsnkjfdnvjfd
* h2h3 [content-type: application/json]
* Using Stream ID: 1 (easy handle 0x55ed8bb7ece0)
> GET /v1/projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key HTTP/2
> Host: cloudkms.googleapis.com
> user-agent: curl/7.88.1
> accept: */*
> authorization: Bearer dsnkjfdnvjfd
> content-type: application/json
>
< HTTP/2 200
< content-type: application/json; charset=UTF-8
< vary: X-Origin
< vary: Referer
< vary: Origin,Accept-Encoding
< date: Tue, 24 Sep 2024 18:25:42 GMT
< server: ESF
< cache-control: private
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< x-content-type-options: nosniff
< accept-ranges: none
<
{
  "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key",
  "primary": {
    "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2024-09-24T17:56:01.905156045Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2024-09-24T17:56:01.905156045Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2024-09-24T17:56:01.905156045Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "2592000s"
}
* Connection #0 to host cloudkms.googleapis.com left intact

ตรวจสอบว่า DNS จับคู่ข้อมูลปลายทาง KMS ที่ใด

จาก tab2, client-vm

dig cloudkms.googleapis.com

ผลลัพธ์ที่คาดไว้

 <<>> DiG 9.18.28-1~deb12u2-Debian <<>> cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62617
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;cloudkms.googleapis.com.       IN      A

;; ANSWER SECTION:
cloudkms.googleapis.com. 300    IN      A       142.250.74.234
cloudkms.googleapis.com. 300    IN      A       142.250.75.234
cloudkms.googleapis.com. 300    IN      A       216.58.214.170
cloudkms.googleapis.com. 300    IN      A       172.217.20.170
cloudkms.googleapis.com. 300    IN      A       172.217.20.202
cloudkms.googleapis.com. 300    IN      A       216.58.215.42
cloudkms.googleapis.com. 300    IN      A       216.58.213.74
cloudkms.googleapis.com. 300    IN      A       142.250.179.74
cloudkms.googleapis.com. 300    IN      A       142.250.179.106
cloudkms.googleapis.com. 300    IN      A       142.250.178.138
cloudkms.googleapis.com. 300    IN      A       142.250.201.170
cloudkms.googleapis.com. 300    IN      A       172.217.18.202
cloudkms.googleapis.com. 300    IN      A       216.58.214.74

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Wed Oct 23 19:58:58 UTC 2024
;; MSG SIZE  rcvd: 260

จาก tab2, client-vm

dig cloudkms.europe-west9.rep.googleapis.com

ผลลัพธ์ที่คาดไว้

<<>> DiG 9.18.28-1~deb12u2-Debian <<>> cloudkms.europe-west9.rep.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2736
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;cloudkms.europe-west9.rep.googleapis.com. IN A

;; ANSWER SECTION:
cloudkms.europe-west9.rep.googleapis.com. 3043 IN A 34.1.65.232

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Wed Oct 23 20:00:04 UTC 2024
;; MSG SIZE  rcvd: 85

ลักษณะการทำงานเริ่มต้นของ Google APIs คือการใช้ปลายทางบริการ API ทั่วโลก ปลายทางนี้จะเปลี่ยนเป็นรายการ IP สาธารณะ การค้นหา cloudkms.googleapis.com แสดงข้อมูลนี้ (หมายเหตุ: ที่อยู่ IP ที่คุณเห็นอาจเป็นที่อยู่ IP ภายนอกอื่น ซึ่งเป็นลักษณะการทํางานปกติของ Google API)

การใช้ปลายทาง Google API ระดับภูมิภาคกับ PSC จะช่วยให้คุณปฏิบัติตามข้อกําหนดระดับภูมิภาคสําหรับการรับส่งข้อมูล API รวมถึงเปลี่ยนความละเอียดจากสาธารณะเป็นส่วนตัวได้ การค้นหา cloudkms.europe-west9.rep.googleapis.com แสดงให้เห็นว่าขณะนี้การแก้ไขปลายทาง KSM API ระดับภูมิภาคยังคงเป็นแบบสาธารณะ

ในส่วนต่อไปนี้ เราจะย้ายข้อมูลจากการใช้ปลายทาง KMS API ทั่วโลกไปยังปลายทางระดับภูมิภาคและเปลี่ยนความละเอียดเป็นส่วนตัวโดยใช้แบ็กเอนด์ PSC

9. สร้าง PSC NEG และตัวจัดสรรภาระงาน

สําหรับส่วนถัดไป ให้เปลี่ยนไปใช้แท็บแรกใน Cloud Shell

คุณจะต้องสร้างตัวจัดสรรภาระงาน HTTP(S) ภายในที่มีกลุ่มปลายทางของเครือข่าย(NEG) ที่ชี้ไปยังปลายทาง KMS ระดับภูมิภาคยุโรปเป็นบริการแบ็กเอนด์ กฎการส่งต่อของโหลดบาลานซ์จะทำหน้าที่เป็นปลายทาง Private Service Connect(PSC)

สร้างกลุ่มปลายทางของเครือข่าย (NEG) ประเภท Private Service Connect และบริการเป้าหมาย europe-west9-cloudkms.example.com

จาก Cloud Shell

#Set the necessary variables

NEG_NAME="l7psc-kms-neg"
PSC_TARGET="cloudkms.europe-west9.rep.googleapis.com"

#Create the Private Service Connect NEG

gcloud compute network-endpoint-groups create ${NEG_NAME} \
    --project=${PROJECT_ID} \
    --region=${REGION} \
    --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
    --psc-target-service=${PSC_TARGET}

# Verify the NEG creation

gcloud compute network-endpoint-groups describe ${NEG_NAME} \
    --project=${PROJECT_ID} \
    --region=${REGION}

สร้างบริการแบ็กเอนด์สำหรับตัวจัดสรรภาระงาน

จาก Cloud Shell

# 1. Set the necessary variables

BACKEND_SERVICE_NAME="l7-psc-kms"

# 2. Create the backend service

gcloud compute backend-services create $BACKEND_SERVICE_NAME \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --region=$REGION \

เพิ่ม NEG ลงในบริการแบ็กเอนด์

จาก Cloud Shell

gcloud compute backend-services add-backend $BACKEND_SERVICE_NAME \
  --network-endpoint-group=${NEG_NAME} \
  --region=$REGION

สร้างแผนที่ URL สำหรับตัวจัดสรรภาระงาน

จาก Cloud Shell

gcloud compute url-maps create l7-psc-url-map \
  --default-service=l7-psc-kms \
  --region=$REGION

สร้างตัวจับคู่เส้นทางสําหรับ URL ที่กําหนดเองซึ่งปลายทางจะใช้

จาก Cloud Shell

gcloud compute url-maps add-path-matcher l7-psc-url-map \
 --path-matcher-name=example \
 --default-service=l7-psc-kms \
 --region=$REGION

สร้างกฎโฮสต์สำหรับ URL ที่กำหนดเอง europe-west9-cloudkms.example.com

จาก Cloud Shell

gcloud compute url-maps add-host-rule l7-psc-url-map \
--hosts=europe-west9-cloudkms.example.com \
--path-matcher-name=example \
--region=$REGION

สร้างพร็อกซี HTTPS เป้าหมายสําหรับตัวจัดสรรภาระงาน ซึ่งต้องใช้การสร้างทรัพยากรใบรับรอง SSL ระดับภูมิภาค โปรดดูขั้นตอนการสร้างใบรับรองที่ลงนามด้วยตนเองที่นี่ เราจะสร้างใบรับรองที่ลงนามด้วยตนเองโดยใช้ openssl และใช้ใบรับรองดังกล่าวเพื่อสร้างทรัพยากรใบรับรองระดับภูมิภาคใน GCP พร็อกซี https เป้าหมายจะใช้ใบรับรองนี้

จาก Cloud Shell

# Set environment variables

export CERT_NAME="my-ssl-cert"

# Generate a private key

openssl genrsa -out private.key 2048

#  Create a configuration file for the CSR

cat > csr_config.cnf << EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[dn]
CN = example.com
O = My Organization
C = US

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = *.example.com
EOF

# Create a CSR using the configuration

openssl req -new -key private.key -out server.csr -config csr_config.cnf

# Create a self-signed certificate using the CSR

openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt \
    -extfile csr_config.cnf -extensions req_ext

# Verify the certificate

openssl x509 -in server.crt -text -noout

#Create a regional SSL certificate resource 

gcloud compute ssl-certificates create ${CERT_NAME} \
    --region=${REGION} \
    --certificate=server.crt \
    --private-key=private.key

#Create the target HTTPS proxy for the load balancer 

gcloud compute target-https-proxies create psc-http-proxy \
    --region=${REGION} \
    --url-map=l7-psc-url-map \
    --ssl-certificates=${CERT_NAME}

สร้างกฎการส่งต่อสำหรับตัวจัดสรรภาระงานที่จะเป็นปลายทาง Private Service Connect ที่อยู่ IP สำหรับกฎการส่งต่อต้องอยู่ในซับเน็ตระดับภูมิภาคใน VPC ซึ่งอยู่ในภูมิภาคเดียวกับปลายทาง API ที่คุณเข้าถึง

จาก Cloud Shell

# Set environment variables

export PROXY_NAME="psc-http-proxy"

# Create the forwarding rule

gcloud compute forwarding-rules create kms-lb-rule \
    --project=${PROJECT_ID} \
    --region=${REGION} \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --network=${VPC_NAME} \
    --subnet=${SUBNET_NAME} \
    --target-https-proxy=${PROXY_NAME} \
    --target-https-proxy-region=${REGION} \
    --address=10.0.0.100 \
    --ports=443

10. การกําหนดค่า DNS

ในส่วนนี้ คุณจะต้องสร้างโซน DNS ส่วนตัวสําหรับ example.com และระเบียน A ที่ชี้ไปยังกฎการส่งต่อที่เราสร้างไว้ในขั้นตอนสุดท้าย

สร้างโซน DNS ส่วนตัวที่มีการจัดการ

จาก Cloud Shell

# Set environment variables

export LB_RULE_NAME="kms-lb-rule"
export DNS_ZONE_NAME="example-com-private-zone"

# Create the private DNS zone

gcloud dns managed-zones create ${DNS_ZONE_NAME} \
    --dns-name="example.com." \
    --description="Private DNS zone for example.com" \
    --visibility=private \
    --networks=${VPC_NAME}

สร้างระเบียน A สำหรับ europe-west9-cloudkms.example.com

จาก Cloud Shell

gcloud dns record-sets transaction start \
   --zone=${DNS_ZONE_NAME}

gcloud dns record-sets transaction add 10.0.0.100 \
   --name=europe-west9-cloudkms.example.com \
   --ttl=300 \
   --type=A \
   --zone=${DNS_ZONE_NAME}

gcloud dns record-sets transaction execute \
   --zone=${DNS_ZONE_NAME}

11. เชื่อมต่อกับ KMS API ระดับภูมิภาคผ่าน PSC

เปลี่ยนกลับไปที่ client-vm ในแท็บ 2 เพื่อเรียกใช้ tcpdump เพื่อดูรายละเอียดการเชื่อมต่อทั้งหมดและทดสอบการเชื่อมต่อกับปลายทาง KMS ระดับภูมิภาคผ่านแบ็กเอนด์ PSC

sudo tcpdump -i any net 10.0.0.100 or port 53 -n

เปิดแท็บที่ 3 ใน Cloud Shell และ SSH ไปยัง client-vm

# Set environment variables

export PROJECT_ID=$(gcloud config get-value project)
export KMS_HOSTNAME="europe-west9-cloudkms.example.com"
export KEY_RING="europe-kr"
export KEY_NAME="europe-key"
export REGION="europe-west9"

# Command to access the specific key

curl -k "https://${KMS_HOSTNAME}/v1/projects/${PROJECT_ID}/locations/${REGION}/keyRings/${KEY_RING}/cryptoKeys/${KEY_NAME}" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)"

ผลลัพธ์ที่คาดไว้สำหรับคําสั่ง curl + TCPDUMP

{
  "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key",
  "primary": {
    "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2024-10-10T18:50:24.357027036Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2024-10-10T18:50:24.357027036Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2024-10-10T18:50:24.357027036Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "2592000s"
}


Tcpdump output

listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
18:13:51.220209 lo    In  IP 127.0.0.1.48873 > 127.0.0.53.53: 2086+ [1au] A? europe-west9-cloudkms.example.com. (62)
18:13:51.220230 lo    In  IP 127.0.0.1.48873 > 127.0.0.53.53: 24619+ [1au] AAAA? europe-west9-cloudkms.example.com. (62)
18:13:51.220669 ens4  Out IP 10.0.0.2.52121 > 169.254.169.254.53: 8885+ [1au] A? europe-west9-cloudkms.example.com. (62)
18:13:51.220784 ens4  Out IP 10.0.0.2.53041 > 169.254.169.254.53: 57748+ [1au] AAAA? europe-west9-cloudkms.example.com. (62)
18:13:51.229638 ens4  In  IP 169.254.169.254.53 > 10.0.0.2.52121: 8885 1/0/1 A 10.0.0.100 (78)
18:13:51.229945 lo    In  IP 127.0.0.53.53 > 127.0.0.1.48873: 2086 1/0/1 A 10.0.0.100 (78)
18:13:51.230068 ens4  In  IP 169.254.169.254.53 > 10.0.0.2.53041: 57748 0/1/1 (155)
18:13:51.230203 lo    In  IP 127.0.0.53.53 > 127.0.0.1.48873: 24619 0/1/1 (155)
18:13:51.230390 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [S], seq 1606150798, win 65320, options [mss 1420,sackOK,TS val 4135800856 ecr 0,nop,wscale 7], length 0
18:13:51.232565 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [S.], seq 1041507402, ack 1606150799, win 65535, options [mss 1420,sackOK,TS val 2276748382 ecr 4135800856,nop,wscale 8], length 0
18:13:51.232583 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [.], ack 1, win 511, options [nop,nop,TS val 4135800859 ecr 2276748382], length 0
18:13:51.235494 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 1:518, ack 1, win 511, options [nop,nop,TS val 4135800862 ecr 2276748382], length 517
18:13:51.236571 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [.], ack 518, win 267, options [nop,nop,TS val 2276748387 ecr 4135800862], length 0
18:13:51.239119 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 1:1356, ack 518, win 267, options [nop,nop,TS val 2276748389 ecr 4135800862], length 1355
18:13:51.239140 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [.], ack 1356, win 501, options [nop,nop,TS val 4135800865 ecr 2276748389], length 0
18:13:51.240978 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 518:598, ack 1356, win 501, options [nop,nop,TS val 4135800867 ecr 2276748389], length 80
18:13:51.241266 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 598:684, ack 1356, win 501, options [nop,nop,TS val 4135800867 ecr 2276748389], length 86
18:13:51.241366 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 684:1646, ack 1356, win 501, options [nop,nop,TS val 4135800867 ecr 2276748389], length 962
18:13:51.242370 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [.], ack 684, win 267, options [nop,nop,TS val 2276748392 ecr 4135800867], length 0
18:13:51.242619 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 1356:1433, ack 1646, win 278, options [nop,nop,TS val 2276748393 ecr 4135800867], length 77
18:13:51.242730 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 1646:1677, ack 1433, win 501, options [nop,nop,TS val 4135800869 ecr 2276748393], length 31
18:13:51.248724 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [.], ack 1677, win 278, options [nop,nop,TS val 2276748399 ecr 4135800869], length 0
18:13:51.296676 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 1433:2357, ack 1677, win 278, options [nop,nop,TS val 2276748447 ecr 4135800869], length 924
18:13:51.297223 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [F.], seq 1677, ack 2357, win 501, options [nop,nop,TS val 4135800923 ecr 2276748447], length 0
18:13:51.298304 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 2357:2381, ack 1678, win 278, options [nop,nop,TS val 2276748448 ecr 4135800923], length 24
18:13:51.298305 ens4  In  IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [F.], seq 2381, ack 1678, win 278, options [nop,nop,TS val 2276748448 ecr 4135800923], length 0
18:13:51.298336 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [R], seq 1606152476, win 0, length 0
18:13:51.298343 ens4  Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [R], seq 1606152476, win 0, length 0


กลับไปที่หน้าต่างแท็บ 2 และตรวจสอบข้อมูล tcpdump คุณจะเห็นว่าคุณเข้าถึงปลายทางระดับภูมิภาคของ Cloud KMS ผ่านปลายทาง PSC ที่สร้างไว้ได้ และปลายทางระดับภูมิภาค europe-west9 จะแก้ไขเป็นโซน Cloud DNS ที่มีการจัดการซึ่งคุณสร้างขึ้นเป็นการส่วนตัว บรรทัดที่เกี่ยวข้องในเอาต์พุต tcpdump ไฮไลต์ไว้ด้านบนและมีคำอธิบายด้านล่าง

18:13:51.229638 ens4 In IP 169.254.169.254.53 > 10.0.0.2.52121: 8885 1/0/1 A 10.0.0.100 (78) (เซิร์ฟเวอร์ข้อมูลเมตา GCP ตอบกลับด้วยระเบียน A: 10.0.0.100 ซึ่งเป็น IP ของตัวจัดสรรภาระงาน การแก้ไข DNS ทํางานได้อย่างถูกต้อง europe-west9-cloudkms.example.com แสดงผลเป็น 10.0.0.100 ซึ่งเป็น IP ของโหลดบาลานซ์)

18:13:51.230390 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [S], seq 1606150798, win 65320, options [mss 1420,sackOK,TS val 4135800856 ecr 0,nop,wscale 7], length 0 (ข้อมูลนี้แสดงการจับมือ TCP สำหรับการเชื่อมต่อ HTTPS กับ IP ของตัวจัดสรรภาระงาน)

ในแท็บ 3 ให้พิมพ์ client-vm

dig europe-west9-cloudkms.example.com

ผลลัพธ์ที่คาดไว้

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> europe-west9-cloudkms.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7008
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;europe-west9-cloudkms.example.com. IN  A

;; ANSWER SECTION:
europe-west9-cloudkms.example.com. 300 IN A     10.0.0.100

;; Query time: 12 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Fri Oct 11 20:03:00 UTC 2024
;; MSG SIZE  rcvd: 78

เอาต์พุตของคำสั่ง dig แสดงให้เห็นว่า URL ที่กำหนดเองที่เราสร้างสำหรับ europe-west9-cloudkms.example.com ได้รับการแก้ไขเป็น 10.0.0.100 อย่างถูกต้อง ซึ่งเป็น IP ของโหลดบาลานเซอร์ภายใน ระบบจะส่งคำขอไปยัง europe-west9-cloudkms.example.com ไปยังตัวจัดสรรภาระงานภายใน จากนั้นระบบจะส่งต่อคำขอไปยังปลายทางระดับภูมิภาคของ KMS ผ่าน Private Service Connect

ตอนนี้คุณปิดแท็บ SSH ไปยัง client-vm ทั้ง 2 แท็บได้แล้ว

12. ขั้นตอนการล้างข้อมูล

ลบคอมโพเนนต์ของห้องทดลองจากเทอร์มินัล Cloud Shell เครื่องเดียว

# Set environment variables

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
export REGION=europe-west9
export ZONE=europe-west9-a
export VPC_NAME="consumer-vpc"
export SUBNET_NAME="consumer-subnet-1"
export NEG_NAME="l7psc-kms-neg"
export BACKEND_SERVICE_NAME="l7-psc-kms"
export CERT_NAME="my-ssl-cert"
export PROXY_NAME="psc-http-proxy"
export LB_RULE_NAME="kms-lb-rule"
export DNS_ZONE_NAME="example-com-private-zone"

#  Delete DNS records and zone

gcloud dns record-sets delete europe-west9-cloudkms.example.com. \
    --zone=${DNS_ZONE_NAME} --type=A --quiet
gcloud dns managed-zones delete ${DNS_ZONE_NAME} --quiet

#  Delete Load Balancer components

gcloud compute forwarding-rules delete ${LB_RULE_NAME} --region=${REGION} --quiet
gcloud compute target-https-proxies delete ${PROXY_NAME} --region=${REGION} --quiet
gcloud compute url-maps delete l7-psc-url-map --region=${REGION} --quiet
gcloud compute backend-services delete ${BACKEND_SERVICE_NAME} --region=${REGION} --quiet
gcloud compute network-endpoint-groups delete ${NEG_NAME} --region=${REGION} --quiet

# Delete SSL certificate

gcloud compute ssl-certificates delete ${CERT_NAME} --region=${REGION} --quiet

#  Delete VM instance

gcloud compute instances delete client-vm --zone=${ZONE} --quiet

#  Delete firewall rules

gcloud compute firewall-rules delete allow-ssh-iap --quiet

# Delete Cloud NAT and router

gcloud compute routers nats delete europe-nat --router=crnat --region=${REGION} --quiet
gcloud compute routers delete crnat --region=${REGION} --quiet

#  Delete subnets and VPC

gcloud compute networks subnets delete ${SUBNET_NAME} --region=${REGION} --quiet
gcloud compute networks subnets delete eu-west9-proxy-subnet --region=${REGION} --quiet
gcloud compute networks delete ${VPC_NAME} --quiet

# Schedule KMS key for deletion and provide instructions for keyring deletion

gcloud kms keys remove-iam-policy-binding europe-key \
    --location ${REGION} \
    --keyring europe-kr \
    --member serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \
    --role roles/cloudkms.admin

gcloud kms keys versions destroy 1 --location=${REGION} --keyring=europe-kr --key=europe-key

#  Disable services (optional, only if you want to completely disable these APIs)

gcloud services disable compute.googleapis.com --force
gcloud services disable servicedirectory.googleapis.com --force
gcloud services disable dns.googleapis.com --force
gcloud services disable cloudkms.googleapis.com --force

#  Clean up local files

rm -f private.key server.csr server.crt csr_config.cnf startup.sh

13. ยินดีด้วย

ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์