Private Service Connect - การใช้การควบคุมบริการ HTTP(S) ของผู้บริโภคสำหรับ Google APIs ระดับภูมิภาค

1. บทนำ

Private Service Connect ช่วยให้คุณสร้างปลายทางส่วนตัวโดยใช้ที่อยู่ IP ภายในส่วนกลางภายในเครือข่าย VPC เพื่อเข้าถึง Google APIs ได้ จากแนวคิดดังกล่าว ตอนนี้คุณสร้างปลายทาง Private Service Connect ที่มีการควบคุมบริการ HTTP(S) ของผู้ใช้ได้โดยใช้ตัวจัดสรรภาระงาน HTTP(S) ภายใน ซึ่งจะมีฟีเจอร์ดังต่อไปนี้

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

ชื่อและที่อยู่ IP เหล่านี้อยู่ภายในเครือข่าย VPC และเครือข่ายภายในองค์กรที่เชื่อมต่อโดยใช้อุโมงค์ข้อมูล Cloud VPN หรือไฟล์แนบ Cloud Interconnect (VLAN)

สิ่งที่คุณจะได้เรียนรู้

  • สร้างปลายทาง Private Service Connect ที่มีการควบคุมบริการ HTTP(S) ของผู้บริโภค
  • สร้างคีย์ริงและคีย์ Cloud Key Management Service (KMS)
  • กำลังสร้าง Cloud DNS Managed Private Zone และระเบียน A
  • เข้าถึง KMS API (ทั้งระดับภูมิภาคและระดับโลก) ที่แก้ปัญหาโดยใช้ API สาธารณะ
  • เข้าถึง KMS API (ทั้งระดับภูมิภาคและทั่วโลก) กับปลายทาง PSC

สิ่งที่คุณต้องมี

  • ความรู้ในการทำให้อินสแตนซ์ใช้งานได้และการกำหนดค่าคอมโพเนนต์เครือข่าย

2. สภาพแวดล้อมการทดสอบ

ระบบจะสร้าง VPC ของผู้บริโภคที่มีซับเน็ต 1 รายการในภูมิภาค us-central1 สำหรับการโฮสต์ VM และกฎการส่งต่อตัวจัดสรรภาระงานภายใน HTTP(S) และซับเน็ตเฉพาะพร็อกซี 1 รายการเพื่อใช้กับตัวจัดสรรภาระงานภายใน HTTP(S) เราจะเริ่มโดยการสร้างคีย์ริงและคีย์ในระบบการจัดการคีย์ (KMS) แล้วแปลงข้อมูลเป็นปลายทาง API สาธารณะ จากนั้นเราจะสร้างปลายทาง PSC เพื่อแปลงเป็นปลายทาง KMS ระดับภูมิภาคใน us-central1

13681df518662ba.png

3. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

เริ่มต้น Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ใช้งานได้ต่อเนื่องและทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานทั้งหมดใน Lab นี้สามารถทำได้โดยใช้เบราว์เซอร์

4. ก่อนเริ่มต้น

เปิดใช้ API

ตรวจสอบว่าตั้งค่ารหัสโปรเจ็กต์ใน Cloud Shell แล้ว

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
export zone=us-central1-a
echo $project
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

gcloud compute networks create consumer-vpc --subnet-mode custom

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

จาก Cloud Shell

gcloud compute networks subnets create consumer-subnet-1 \
--network consumer-vpc \
--range 10.0.0.0/24 \
--region $region \
--enable-private-ip-google-access

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

จาก Cloud Shell

gcloud compute networks subnets create proxy-subnet1 \
--purpose=INTERNAL_HTTPS_LOAD_BALANCER \
--role=ACTIVE \
--network consumer-vpc \
--range 10.100.100.0/24 \
--region $region

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

สำหรับห้องทดลองนี้ คุณจะใช้ IAP เพื่อเชื่อมต่อกับอินสแตนซ์ที่คุณสร้าง กฎไฟร์วอลล์ต่อไปนี้จะช่วยให้คุณเชื่อมต่อกับอินสแตนซ์ผ่าน 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 consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

สร้างอินสแตนซ์ Cloud NAT

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

สร้าง Cloud Router

จาก Cloud Shell

gcloud compute routers create crnat \
    --network consumer-vpc \
    --region $region

สร้าง Cloud NAT

จาก Cloud Shell

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

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

จาก Cloud Shell

gcloud kms keyrings create central-keyring \
    --location $region

gcloud kms keyrings create global-keyring \
    --location global

จาก Cloud Shell

gcloud kms keys create central-key \
    --location $region \
    --keyring central-keyring \
    --purpose encryption

gcloud kms keys create global-key \
    --location global \
    --keyring global-keyring \
    --purpose encryption

ยืนยันว่าสร้างคีย์ริงและคีย์จาก Cloud Shell เรียบร้อยแล้วในภูมิภาค us-central1

gcloud kms keys list \
    --location $region \
    --keyring central-keyring

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

NAME: projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

จาก Cloud Shell

gcloud kms keys list \
    --location global \
    --keyring global-keyring

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

NAME: projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

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

7. สร้าง VM ของไคลเอ็นต์และเชื่อมต่อกับปลายทางระดับภูมิภาคของ KMS

ถัดไป คุณจะต้องสร้าง VM ของไคลเอ็นต์, SSH ลงใน VM และทดสอบความละเอียดของปลายทาง KMS API ระดับภูมิภาคของ us-central1

จาก Cloud Shell

gcloud compute instances create client-vm \
    --network=consumer-vpc \
    --subnet=consumer-subnet-1 \
    --zone=$zone \
    --no-address \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install dnsutils -y
    sudo apt-get install tcpdump -y'

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

 gcloud projects describe $project

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

จาก Cloud Shell

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


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

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

a36edc967333315a.png

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

จาก Cloud Shell

gcloud beta compute ssh --zone us-central1-a "client-vm" \
--tunnel-through-iap \
--project <PROJECT_ID>

เชื่อมต่อกับปลายทาง API ระดับภูมิภาคของ KMS โดยใช้ชื่อคีย์ KMS ที่คุณระบุไว้ก่อนหน้านี้

จากแท็บ 2 client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
--resolve cloudkms.googleapis.com:443:us-central1-cloudkms.googleapis.com \
https://cloudkms.googleapis.com/v1/projects/<YOUR_PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key

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

{
  "name": "projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key",
  "primary": {
    "name": "projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-12T17:41:21.543348620Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-12T17:41:21.543348620Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-12T17:41:21.543348620Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"
}

จากแท็บ 2 client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
--resolve cloudkms.googleapis.com:443:cloudkms.googleapis.com \
https://cloudkms.googleapis.com/v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key

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

{
  "name": "projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key",
  "primary": {
    "name": "projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-22T19:19:43.271238847Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-22T19:19:43.271238847Z"
  },  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-22T19:19:43.271238847Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"}

ตรวจสอบตำแหน่งที่ DNS แปลงปลายทาง KMS ส่วนกลางของ us-central เทียบกับปลายทางส่วนกลาง

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

dig us-central1-cloudkms.googleapis.com

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

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Debian <<>> us-central1-cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4383
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-cloudkms.googleapis.com. IN        A

;; ANSWER SECTION:
us-central1-cloudkms.googleapis.com. 300 IN A   142.250.125.95

;; Query time: 4 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Fri Nov 12 20:40:05 UTC 2021
;; MSG SIZE  rcvd: 80

จากแท็บ 2 client-vm

dig cloudkms.googleapis.com

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

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Debian <<>> cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49528
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
cloudkms.googleapis.com. 300    IN      A       209.85.200.95

;; Query time: 8 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Mon Nov 22 15:26:17 UTC 2021
;; MSG SIZE  rcvd: 68

จากผลลัพธ์ของการดึงข้อมูล จะเห็นได้ว่าการแปลง DNS ของปลายทาง KMS ระดับภูมิภาค US-central1 และปลายทาง Global KMS เปลี่ยนเป็นที่อยู่ IP ภายนอก (หมายเหตุ: ที่อยู่ IP ที่คุณเห็นอาจเป็นที่อยู่ IP ภายนอกรายการอื่น ซึ่งเป็นลักษณะการทำงานปกติของ Google API)

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

8. สร้างปลายทาง Private Service Connect

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

สร้างกลุ่มปลายทางเครือข่าย (NEG) ด้วยประเภท Privet Service Connect และกำหนดเป้าหมายบริการ us-central1-cloudkms.googleapis.com

จาก Cloud Shell

gcloud beta compute network-endpoint-groups create l7psc-kms-neg \
  --network-endpoint-type=private-service-connect \
  --psc-target-service=us-central1-cloudkms.googleapis.com \
  --region=$region

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

จาก Cloud Shell

gcloud compute backend-services create l7-psc-kms \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --region=$region

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

จาก Cloud Shell

gcloud beta compute backend-services add-backend l7-psc-kms \
  --network-endpoint-group=l7psc-kms-neg \
  --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 ที่กำหนดเอง us-central1-cloudkms.example.com

จาก Cloud Shell

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

สร้างพร็อกซีเป้าหมายสำหรับตัวจัดสรรภาระงาน สำหรับกรณีการใช้งานเวอร์ชันที่ใช้งานจริง ขอแนะนำให้ใช้ HTTP(S) และใบรับรองที่กำหนดเองสำหรับโฮสต์ที่คุณกำหนดค่าในคำสั่งสุดท้าย

จาก Cloud Shell

gcloud compute target-http-proxies create psc-http-proxy \
    --url-map=l7-psc-url-map \
    --region=$region

สร้างกฎการส่งต่อสำหรับตัวจัดสรรภาระงานที่จะทำหน้าที่เป็น Private Service Connect Endpoint

จาก Cloud Shell

gcloud beta compute forwarding-rules create l7-psc-forwarding-rule \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=consumer-vpc \
  --subnet=consumer-subnet-1 \
  --address=10.0.0.100 \
  --ports=80 \
  --region=$region \
  --target-http-proxy=psc-http-proxy \
  --target-http-proxy-region=$region

9. การกำหนดค่า DNS

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

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

จาก Cloud Shell

gcloud dns managed-zones create example \
    --description="example domain for KMS" \
    --dns-name=example.com \
    --networks=consumer-vpc \
    --visibility=private

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

จาก Cloud Shell

gcloud dns record-sets transaction start \
   --zone=example

gcloud dns record-sets transaction add 10.0.0.100 \
   --name=us-central1-cloudkms.example.com \
   --ttl=300 \
   --type=A \
   --zone=example

gcloud dns record-sets transaction execute \
   --zone=example

10. เชื่อมต่อกับปลายทาง KMS ระดับภูมิภาคผ่าน PSC

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

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

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

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
http://us-central1-cloudkms.example.com/v1/projects/<YOUR_PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key

ผลลัพธ์ที่คาดหวัง + TCPDUMP

{
  "name": "projects/psc-2-321213/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key",
  "primary": {
    "name": "projects/psc-2-321213/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-12T17:41:21.543348620Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-12T17:41:21.543348620Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-12T17:41:21.543348620Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"
}

---

19:54:42.924923 IP 10.0.0.3.55290 > 169.254.169.254.53: 26132+ A? cloudkms.googleapis.com. (41)
19:54:42.925137 IP 10.0.0.3.55290 > 169.254.169.254.53: 40734+ AAAA? cloudkms.googleapis.com. (41)
19:54:42.931480 IP 169.254.169.254.53 > 10.0.0.3.55290: 26132 1/0/0 A 10.0.0.100 (57)
19:54:42.931781 IP 169.254.169.254.53 > 10.0.0.3.55290: 40734 1/0/0 AAAA 2607:f8b0:4001:c0d::5f (69)
19:54:42.932285 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [S], seq 3382081170, win 65320, options [mss 1420,sackOK,TS val 1907763603 ecr 0,nop,wscale 7], length 0
19:54:42.934951 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [S.], seq 3147938658, ack 3382081171, win 65535, options [mss 1420,sackOK,TS val 3206048204 ecr 1907763603,nop,wscale 8], length 0
19:54:42.934978 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1, win 511, options [nop,nop,TS val 1907763606 ecr 3206048204], length 0
19:54:42.935182 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [P.], seq 1:422, ack 1, win 511, options [nop,nop,TS val 1907763606 ecr 3206048204], length 421: HTTP: GET /v1/projects/<PROJECT_ID/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key HTTP/1.1
19:54:42.935614 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [.], ack 422, win 261, options [nop,nop,TS val 3206048205 ecr 1907763606], length 0
19:54:43.010268 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [P.], seq 1:1072, ack 422, win 261, options [nop,nop,TS val 3206048280 ecr 1907763606], length 1071: HTTP: HTTP/1.1 200 OK
19:54:43.010295 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1072, win 503, options [nop,nop,TS val 1907763681 ecr 3206048280], length 0
19:54:43.011545 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [F.], seq 422, ack 1072, win 503, options [nop,nop,TS val 1907763683 ecr 3206048280], length 0
19:54:43.012013 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [F.], seq 1072, ack 423, win 261, options [nop,nop,TS val 3206048282 ecr 1907763683], length 0
19:54:43.012021 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1073, win 503, options [nop,nop,TS val 1907763683 ecr 3206048282], length 0

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

จากแท็บ 3 client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
http://us-central1-cloudkms.example.com/v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key

ผลลัพธ์ที่คาดหวัง + TCPDUMP

{
  "error": {
    "code": 404,
    "message": "The request concerns location 'global' but was sent to location 'us-central1'. Either Cloud KMS is not available in 'global' or the request was misrouted. gRPC clients must ensure that 'x-goog-request-params' is specified in request metadata. See https://cloud.google.com/kms/docs/grpc for more information.",
    "status": "NOT_FOUND"
  }
}

---

20:04:32.199247 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [S], seq 2782317346, win 65320, options [mss 1420,sackOK,TS val 1908352831 ecr 0,nop,wscale 7], length 0
20:04:32.201643 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [S.], seq 1927472124, ack 2782317347, win 65535, options [mss 1420,sackOK,TS val 3731555085 ecr 1908352831,nop,wscale 8], length 0
20:04:32.201666 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 1, win 511, options [nop,nop,TS val 1908352834 ecr 3731555085], length 0
20:04:32.201812 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [P.], seq 1:415, ack 1, win 511, options [nop,nop,TS val 1908352834 ecr 3731555085], length 414: HTTP: GET /v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key HTTP/1.1
20:04:32.202308 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [.], ack 415, win 261, options [nop,nop,TS val 3731555086 ecr 1908352834], length 0
20:04:32.237629 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [P.], seq 1:760, ack 415, win 261, options [nop,nop,TS val 3731555121 ecr 1908352834], length 759: HTTP: HTTP/1.1 404 Not Found
20:04:32.237656 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 760, win 506, options [nop,nop,TS val 1908352870 ecr 3731555121], length 0
20:04:32.238283 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [F.], seq 415, ack 760, win 506, options [nop,nop,TS val 1908352870 ecr 3731555121], length 0
20:04:32.238833 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [F.], seq 760, ack 416, win 261, options [nop,nop,TS val 3731555122 ecr 1908352870], length 0
20:04:32.238851 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 761, win 506, options [nop,nop,TS val 1908352871 ecr 3731555122], length 0

การพยายามเข้าถึงคีย์/คีย์ริงของ Cloud KMS ส่วนกลางจะทำให้เกิดข้อผิดพลาด คุณจะเห็นความพยายามเชื่อมต่อเหล่านี้ใน tcpdump ด้วย

ในแท็บ 3 client-vm

dig us-central1-cloudkms.example.com

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

; <<>> DiG 9.11.5-P4-5.1+deb10u7-Debian <<>> us-central1-cloudkms.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27474
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-cloudkms.example.com. IN   A

;; ANSWER SECTION:
us-central1-cloudkms.example.com. 300 IN A      10.0.0.100

;; Query time: 7 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Mon May 23 16:22:12 UTC 2022
;; MSG SIZE  rcvd: 77

เมื่อตรวจสอบแล้ว คุณจะเห็นว่า URL ที่กำหนดเองที่เราสร้างสำหรับ us-central1-cloudkms.googleapis.com ชี้ไปยังปลายทาง PSC และแก้ไขเฉพาะทรัพยากรที่สร้างขึ้นในภูมิภาคดังกล่าวเท่านั้น

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

11. ขั้นตอนการทำความสะอาด

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

gcloud dns record-sets transaction start --zone=example

gcloud dns record-sets transaction remove 10.0.0.100 \
    --name=us-central1-cloudkms.example.com \
    --ttl=300 \
    --type=A \
    --zone=example

gcloud dns record-sets transaction execute --zone=example

gcloud dns managed-zones delete example

gcloud compute forwarding-rules delete l7-psc-forwarding-rule --region=$region --quiet

gcloud compute target-http-proxies delete psc-http-proxy --region=$region --quiet

gcloud compute url-maps delete l7-psc-url-map --region=$region --quiet

gcloud compute backend-services delete l7-psc-kms --region=$region --quiet

gcloud compute network-endpoint-groups delete l7psc-kms-neg --region=$region --quiet

gcloud compute instances delete client-vm --zone=$zone --quiet

#Replace PROJECT_NUMBER
gcloud kms keys remove-iam-policy-binding global-key --keyring=global-keyring --location=global \
--member=serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
--role roles/cloudkms.admin

#Replace PROJECT_NUMBER
gcloud kms keys remove-iam-policy-binding central-key --keyring=central-keyring --location=$region \
--member=serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
--role roles/cloudkms.admin

gcloud kms keys versions destroy 1 --location=global --keyring=global-keyring --key=global-key

gcloud kms keys versions destroy 1 --location=$region --keyring=central-keyring --key=central-key

gcloud compute routers nats delete central-nat --router=crnat --region=$region --quiet

gcloud compute routers delete crnat --region=$region --quiet

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

gcloud compute networks subnets delete proxy-subnet1 --region=$region --quiet

gcloud compute networks subnets delete consumer-subnet-1 --region=$region --quiet

gcloud compute networks delete consumer-vpc --quiet

12. ยินดีด้วย

ขอแสดงความยินดีที่เรียน Codelab จนจบ

หัวข้อที่ครอบคลุม

  • การสร้างปลายทาง Private Service Connect ด้วยการควบคุมบริการ HTTP(S) ของผู้บริโภค
  • การสร้างคีย์ริงและคีย์ Cloud Key Management (KMS)
  • กำลังสร้าง Cloud DNS Managed Private Zone และระเบียน A
  • การเข้าถึง KMS API (ทั้งระดับภูมิภาคและระดับโลก) ได้รับการแก้ไขแล้วโดยใช้ API สาธารณะ
  • การเข้าถึง KMS API (ทั้งระดับภูมิภาคและระดับโลก) เทียบกับปลายทาง PSC