1. ภาพรวม
ข้อมูลลับ เช่น รหัสผ่าน คีย์ API เป็นข้อมูลที่มีความละเอียดอ่อนซึ่งควรจัดเก็บไว้ในพื้นที่เก็บข้อมูลที่ปลอดภัยและเข้ารหัส มีการควบคุมการเข้าถึง และตรวจสอบได้ บางระบบเลือกใช้ Vault เพื่อจัดเก็บข้อมูลลับเหล่านี้ ใน Google Cloud คุณสามารถใช้ Secret Manager ซึ่งเป็นบริการที่มีการจัดการเพื่อจัดเก็บข้อมูลลับอย่างปลอดภัย และควบคุมการเข้าถึงข้อมูลลับแต่ละรายการโดยใช้ IAM
ใน Spring Boot คุณสามารถใช้ Spring Cloud GCP เพื่อเข้าถึงข้อมูลลับเหล่านี้ได้อย่างง่ายดายโดยอ้างอิงถึงข้อมูลลับดังกล่าวเหมือนกับพร็อพเพอร์ตี้อื่นๆ ของ Spring
ในโค้ดแล็บนี้ คุณจะจัดเก็บข้อมูลลับใน Secret Manager จากนั้นสร้างไมโครเซอร์วิส Spring Boot อย่างง่ายและเรียกข้อมูลลับ
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างแอปพลิเคชัน Java ของ Spring Boot และกำหนดค่า Secret Manager
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud
- เบราว์เซอร์ เช่น Chrome หรือ Firefox
- คุ้นเคยกับโปรแกรมแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, EMAC หรือ Nano
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML/CSS เท่าใด
คุณจะให้คะแนนประสบการณ์การใช้บริการ Google Cloud เท่าใด
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
Google Cloud Shell
แม้ว่าบริการของ Google Cloud จะใช้งานจากระยะไกลในแล็ปท็อปได้ แต่ในโค้ดแล็บนี้เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell
หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ด้านล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน
เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ Chromebook
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์ของคุณแล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list
เอาต์พุตของคำสั่ง
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
เอาต์พุตของคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตของคำสั่ง
Updated property [core/project].
3. กำหนดค่าข้อมูลลับ
หากต้องการใช้ Secret Manager ให้เปิดใช้ API ก่อนโดยทำดังนี้
$ gcloud services enable secretmanager.googleapis.com
จากนั้นสร้างข้อมูลลับชื่อ greeting โดยมีค่าเป็น Hello ดังนี้
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
คำสั่งนี้ใช้ STDIN เพื่อระบุค่าให้กับบรรทัดคำสั่ง แต่คุณยังใส่ค่าลับในไฟล์และระบุชื่อไฟล์สำหรับอาร์กิวเมนต์ --data-file ได้ด้วย
คุณแสดงรายการลับทั้งหมดได้โดยใช้ gcloud CLI ดังนี้
$ gcloud secrets list
4. สร้างบริการ REST ของ Spring Boot ใหม่
หลังจากเปิดใช้ Cloud Shell แล้ว คุณสามารถใช้บรรทัดคำสั่งเพื่อสร้างแอปพลิเคชัน Spring Boot ใหม่ด้วย Spring Initializr ได้โดยทำดังนี้
$ curl https://start.spring.io/starter.tgz -d packaging=jar \ -d dependencies=web,cloud-gcp \ -d bootVersion=3.0.6 \ -d type=maven-project \ -d baseDir=hello-secret-manager | tar -xzvf - \ && cd hello-secret-manager
ใน pom.xml ให้เพิ่มการอ้างอิงของ Spring Cloud GCP Starter ดังนี้
pom.xml
<project>
...
<dependencies>
...
<!-- Add Secret Manager Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
</dependency>
</dependencies>
...
</project>
ในไฟล์ src/main/resources/application.properties ให้เพิ่มการกำหนดค่าต่อไปนี้เพื่อเปิดใช้ Spring Boot Config Data API
spring.config.import=sm://
ซึ่งจะกำหนดค่าแหล่งที่มาของพร็อพเพอร์ตี้ Spring เพื่อให้คุณอ้างอิงถึงข้อมูลลับได้โดยใช้ค่าพร็อพเพอร์ตี้ที่มีคำนำหน้าเป็น sm:// เช่น sm://greeting
ดูรายละเอียดเพิ่มเติมเกี่ยวกับรูปแบบของพร็อพเพอร์ตี้ได้ในเอกสารประกอบ Spring Cloud GCP Secret Manager โปรดทราบว่าapplication.propertiesข้อกำหนดนี้เป็นของใหม่ใน Spring Cloud GCP 4.x อ่านรายละเอียดเพิ่มเติมในคำแนะนำในการย้ายข้อมูล
สร้างตัวควบคุม REST ใหม่โดยเพิ่มไฟล์คลาสใหม่
src/main/java/com/example/demo/HelloSecretController.java
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloSecretController {
String greeting = "Hi";
@GetMapping("/")
public String hello() {
return greeting + " World!";
}
}
คุณสามารถเริ่มแอปพลิเคชัน Spring Boot ได้ตามปกติด้วยปลั๊กอิน Spring Boot
ตรวจสอบว่าตั้งค่า JAVA_HOME เป็น JDK เวอร์ชันที่ถูกต้อง
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
ข้ามการทดสอบสำหรับ Lab นี้ แล้วเริ่มแอปพลิเคชันกันเลย
$ ./mvnw -DskipTests spring-boot:run
เมื่อแอปพลิเคชันเริ่มทำงานแล้ว ให้คลิกไอคอนแสดงตัวอย่างเว็บ
ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080
หลังจากรอสักครู่ คุณจะเห็นผลลัพธ์ดังนี้

5. เรียกข้อมูลลับ
คุณใช้คำอธิบายประกอบ @Value เพื่ออ้างอิงถึงพร็อพเพอร์ตี้ลับได้โดยใช้คำนำหน้า sm://
ในคลาส HelloSecretController ให้แทรกค่า greeting โดยใช้คำอธิบายประกอบต่อไปนี้
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
คุณสามารถเริ่มแอปพลิเคชัน Spring Boot ได้ตามปกติด้วยปลั๊กอิน Spring Boot มาข้ามการทดสอบสำหรับห้องทดลองนี้กัน
$ ./mvnw -DskipTests spring-boot:run
เมื่อแอปพลิเคชันเริ่มทำงานแล้ว ให้คลิกไอคอนแสดงตัวอย่างเว็บ
ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080
หลังจากรอสักครู่ คุณจะเห็นผลลัพธ์ดังนี้

นอกจากนี้ คุณยังแมปค่ากับพร็อพเพอร์ตี้ใน application.properties ได้ด้วย
src/main/resources/application.properties
greeting=${sm://greeting}
ใน HelloSecretController คุณสามารถอ้างอิงชื่อพร็อพเพอร์ตี้ทั่วไปนี้แทนชื่อ Secret Manager ได้
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
คุณสามารถเริ่มแอปพลิเคชัน Spring Boot ได้ตามปกติด้วยปลั๊กอิน Spring Boot มาข้ามการทดสอบสำหรับห้องทดลองนี้กัน
$ ./mvnw -DskipTests spring-boot:run
เมื่อแอปพลิเคชันเริ่มทำงานแล้ว ให้คลิกไอคอนแสดงตัวอย่างเว็บ
ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080
การอัปเดตค่าข้อมูลลับ
การใช้ไวยากรณ์ย่อ sm://greeting จะทำให้คุณใช้เวอร์ชันล่าสุดของข้อมูลลับโดยอัตโนมัติ การสร้างเวอร์ชันใหม่ของข้อมูลลับจะช่วยให้คุณอัปเดตแอปพลิเคชันได้โดยไม่ต้องเปลี่ยนโค้ด
อัปเดตค่าของข้อมูลลับโดยการเพิ่มเวอร์ชันใหม่
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
รีสตาร์ทแอปพลิเคชัน แล้วดูว่าระบบแสดงผลเวอร์ชันใหม่ของข้อมูลลับ

การขยายแนวคิดนี้
เทคนิคนี้มีประโยชน์อย่างยิ่งหากคุณใช้โปรไฟล์แอปพลิเคชัน Spring Boot ที่แตกต่างกัน เช่น คุณสร้างข้อมูลลับได้ เช่น greeting-dev, greeting-staging, greeting-prod และในแต่ละโปรไฟล์ ให้แมปกับคำทักทายที่เหมาะสม
วิธีสร้างข้อมูลลับ greeting-prod
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
วิธีสร้างไฟล์ application-prod.properties
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
คุณสามารถเริ่มแอปพลิเคชัน Spring Boot ได้ตามปกติด้วยปลั๊กอิน Spring Boot แต่ใช้โปรไฟล์ prod มาข้ามการทดสอบสำหรับห้องทดลองนี้กัน
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
เมื่อแอปพลิเคชันเริ่มทำงานแล้ว ให้คลิกไอคอนแสดงตัวอย่างเว็บ
ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080
หลังจากรอสักครู่ คุณจะเห็นผลลัพธ์ดังนี้

6. สรุป
ในแล็บนี้ คุณได้สร้างบริการที่กำหนดค่าได้โดยใช้ข้อมูลลับที่จัดเก็บไว้ใน Secret Manager โดยใช้ชื่อพร็อพเพอร์ตี้ของ Spring ที่มีคำนำหน้าเป็น sm:// และแทรกค่าจากไฟล์ applications.properties และคำอธิบายประกอบ @Value
7. ยินดีด้วย
คุณได้เรียนรู้วิธีใช้ Secret Manager API ใน Java แล้ว
ดูข้อมูลเพิ่มเติม
- โปรเจ็กต์ Spring บน GCP: http://cloud.spring.io/spring-cloud-gcp/
- ที่เก็บ Spring บน GCP ใน GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java ใน Google Cloud: https://cloud.google.com/java/
- การควบคุมการเข้าถึงข้อมูลลับใน Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- การบันทึกการตรวจสอบใน Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป