1. ภาพรวม
ซึ่งข้อมูลลับต่างๆ เช่น รหัสผ่าน คีย์ API คือข้อมูลที่ละเอียดอ่อนที่ควรเก็บไว้ในพื้นที่เก็บข้อมูลที่เข้ารหัสและปลอดภัย มีการควบคุมการเข้าถึง และตรวจสอบได้ บางระบบอาจเลือกใช้ห้องนิรภัยเพื่อจัดเก็บข้อมูลลับเหล่านี้ ใน Google Cloud คุณสามารถใช้ Secret Manager ซึ่งเป็นบริการที่มีการจัดการเพื่อจัดเก็บข้อมูลลับอย่างปลอดภัยและควบคุมการเข้าถึงข้อมูลลับเฉพาะโดยใช้ IAM
ใน Spring Boot คุณสามารถใช้ Spring Cloud GCP เพื่อเข้าถึงข้อมูลลับเหล่านี้ได้ง่ายๆ โดยอ้างถึงข้อมูลลับว่าเป็นพร็อพเพอร์ตี้อื่นๆ ของ Spring
ใน Codelab นี้ คุณจะจัดเก็บข้อมูลลับใน Secret Manager จากนั้นสร้าง Microservice สำหรับการเปิดเครื่อง Spring Boot แบบง่ายและเรียกข้อมูลลับ
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างแอปพลิเคชัน Spring Boot Java และกำหนดค่า Secret Manager
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud
- เบราว์เซอร์ เช่น Chrome หรือ Firefox
- คุ้นเคยกับเครื่องมือแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, EMACs หรือ Nano
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML/CSS อย่างไร
คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมในแบบของคุณ
- ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) และจะมีการอ้างอิงใน Codelab ว่า PROJECT_ID
ในภายหลัง
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
Google Cloud Shell
แม้ว่าบริการของ Google Cloud จะทำงานจากระยะไกลได้จากแล็ปท็อป แต่ใน Codelab นี้ เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell จาก Cloud Console
หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ 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
ให้เพิ่มทรัพยากร Dependency เริ่มต้นของ GCP ระบบคลาวด์ Spring:
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
ได้
ดูรายละเอียดเพิ่มเติมเกี่ยวกับรูปแบบของพร็อพเพอร์ตี้ได้จากเอกสารประกอบเกี่ยวกับ Secret Manager ของ GCP สำหรับ Cloud ในฤดูใบไม้ผลิ โปรดทราบว่าข้อกำหนดของ application.properties
เป็นข้อกำหนดใหม่ใน GCP เวอร์ชัน 4.x ของ Spring Cloud อ่านรายละเอียดเพิ่มเติมในคำแนะนำในการย้ายข้อมูล
สร้างตัวควบคุม 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/
มาข้ามการทดสอบสำหรับห้องทดลองนี้กัน แล้วเริ่มแอปพลิเคชันกันเลย
$ ./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 คุณอ้างอิงถึงชื่อพร็อพเพอร์ตี้ทั่วไปนี้ได้ ซึ่งต่างจากชื่อผู้จัดการข้อมูลลับดังนี้
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 แล้ว
ดูข้อมูลเพิ่มเติม
- ฤดูใบไม้ผลิในโปรเจ็กต์ GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring ในที่เก็บ GitHub ของ GCP: 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
- การบันทึกการตรวจสอบในเครื่องมือจัดการข้อมูลลับ: https://cloud.google.com/secret-manager/docs/audit-logging
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0