1. บทนำ
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
ระบบจะสร้าง VPC ของผู้บริโภคที่มีซับเน็ต 1 รายการในภูมิภาค europe-west9 สำหรับการโฮสต์ VM, กฎการส่งต่อของตัวจัดสรรภาระงานแอปพลิเคชันระดับภูมิภาคภายใน และแบ็กเอนด์ PSC รวมถึงซับเน็ตเฉพาะพร็อกซี 1 รายการสำหรับใช้กับตัวจัดสรรภาระงาน เราจะสร้างคีย์ริงและคีย์ในระบบจัดการคีย์ (KMS) ของ Cloud ในภูมิภาคยุโรปตะวันตก จากนั้นเราจะสร้างตัวจัดสรรภาระงานและแบ็กเอนด์ PSC เพื่อแก้ไขเป็น KMS API ระดับภูมิภาคใน europe-west9
3. การตั้งค่าและข้อกําหนด
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะซ้ำกันไม่ได้ในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าอุปกรณ์พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้จะไม่เสียค่าใช้จ่ายมากนัก หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณลบทรัพยากรที่สร้างไว้หรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่ม Cloud Shell
แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้
เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 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 เพิ่มเติมโดยคลิก + (ภาพหน้าจอด้านล่าง)
ในแท็บที่ 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 จนเสร็จสมบูรณ์