1. Tổng quan
Các thông tin bí mật như mật khẩu, khoá API là thông tin nhạy cảm cần được lưu trữ trong một bộ nhớ được mã hoá và bảo mật, có quyền truy cập được kiểm soát và có thể kiểm tra được. Một số hệ thống chọn sử dụng Vault để lưu trữ các khoá bí mật này. Trên Google Cloud, bạn có thể sử dụng Secret Manager (một dịch vụ được quản lý) để lưu trữ các dữ liệu bí mật một cách an toàn và kiểm soát quyền truy cập vào từng dữ liệu bí mật bằng IAM.
Trong Spring Boot, bạn có thể sử dụng Spring Cloud GCP để dễ dàng truy cập vào các khoá bí mật này bằng cách tham chiếu chúng dưới dạng bất kỳ thuộc tính Spring nào khác.
Trong lớp học lập trình này, bạn sẽ lưu trữ một bí mật trong Secret Manager, sau đó tạo các vi dịch vụ Spring Boot đơn giản và truy xuất bí mật đó.
Kiến thức bạn sẽ học được
- Cách tạo ứng dụng Java Spring Boot và định cấu hình Secret Manager.
Bạn cần có
- Một dự án trên Google Cloud
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Làm quen với các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, EMAC hoặc Nano
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm xây dựng ứng dụng web HTML/CSS?
Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)
Hãy nhớ mã dự án, một tên duy nhất trên tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Google Cloud Shell
Mặc dù bạn có thể vận hành các dịch vụ của Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.
Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:
Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.
Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Định cấu hình một Secret
Để sử dụng Secret Manager, trước tiên hãy bật API này:
$ gcloud services enable secretmanager.googleapis.com
Sau đó, hãy tạo một mã bí mật có tên là greeting, với giá trị là Hello:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
Lệnh này sử dụng STDIN để cung cấp giá trị cho dòng lệnh. Tuy nhiên, bạn cũng có thể chỉ cần đặt giá trị bí mật vào một tệp và chỉ định tên tệp cho đối số --data-file.
Bạn có thể liệt kê tất cả các khoá bí mật bằng giao diện dòng lệnh gcloud:
$ gcloud secrets list
4. Tạo một Dịch vụ REST Spring Boot mới
Sau khi Cloud Shell khởi chạy, bạn có thể sử dụng dòng lệnh để tạo một ứng dụng Spring Boot mới bằng 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
Trong pom.xml, hãy thêm phần phụ thuộc của 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>
Trong tệp src/main/resources/application.properties, hãy thêm cấu hình sau để bật API dữ liệu cấu hình Spring Boot:
spring.config.import=sm://
Thao tác này sẽ định cấu hình Nguồn thuộc tính Spring để bạn có thể tham chiếu đến các khoá bí mật bằng cách sử dụng giá trị thuộc tính, với tiền tố là sm://, ví dụ: sm://greeting.
Hãy xem tài liệu về Spring Cloud GCP Secret Manager để biết thêm thông tin chi tiết về định dạng của thuộc tính này. Xin lưu ý rằng yêu cầu application.properties là yêu cầu mới trong Spring Cloud GCP 4.x. Đọc thêm thông tin chi tiết trong hướng dẫn di chuyển.
Tạo một bộ điều khiển REST mới bằng cách thêm một tệp lớp mới:
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!";
}
}
Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot.
Đảm bảo JAVA_HOME được đặt thành phiên bản JDK chính xác:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Hãy bỏ qua các bài kiểm thử cho lớp học lập trình này và bắt đầu ứng dụng:
$ ./mvnw -DskipTests spring-boot:run
Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web
trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.
Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

5. Truy xuất một giá trị bí mật
Bạn có thể dùng chú giải @Value để tham chiếu đến thuộc tính bí mật bằng tiền tố sm://.
Trong lớp HelloSecretController, hãy chèn giá trị greeting bằng chú giải:
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot. Hãy bỏ qua các bài kiểm tra cho phòng thí nghiệm này:
$ ./mvnw -DskipTests spring-boot:run
Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web
trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.
Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

Bạn cũng có thể liên kết giá trị với một thuộc tính trong application.properties:
src/main/resources/application.properties
greeting=${sm://greeting}
Trong HelloSecretController, bạn có thể tham chiếu đến tên thuộc tính chung chung này thay vì tên Secret Manager:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot. Hãy bỏ qua các bài kiểm tra cho phòng thí nghiệm này:
$ ./mvnw -DskipTests spring-boot:run
Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web
trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.
Cập nhật giá trị bí mật
Khi sử dụng cú pháp ngắn sm://greeting, bạn sẽ tự động dùng phiên bản mới nhất của khoá bí mật. Bằng cách tạo một phiên bản mới của khoá bí mật, bạn có thể cập nhật ứng dụng mà không cần thay đổi mã.
Cập nhật giá trị của khoá bí mật bằng cách thêm một phiên bản mới:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
Khởi động lại ứng dụng và xem phiên bản mới của khoá bí mật đang được trả về.

Mở rộng khái niệm này
Kỹ thuật này đặc biệt hữu ích nếu bạn sử dụng các hồ sơ ứng dụng Spring Boot khác nhau. Ví dụ: bạn có thể tạo các khoá bí mật như greeting-dev, greeting-staging, greeting-prod. Và trong mỗi hồ sơ, hãy liên kết với lời chào phù hợp.
Tạo một khoá bí mật greeting-prod:
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
Tạo tệp application-prod.properties:
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot, nhưng với hồ sơ prod. Hãy bỏ qua các bài kiểm tra cho phòng thí nghiệm này:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web
trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.
Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

6. Tóm tắt
Trong phòng thí nghiệm này, bạn đã tạo một dịch vụ có thể được định cấu hình bằng cách sử dụng các khoá bí mật được lưu trữ trong Secret Manager bằng cách sử dụng tên thuộc tính của Spring có tiền tố là sm:// và chèn giá trị từ tệp applications.properties và chú thích @Value.
7. Xin chúc mừng!
Bạn đã tìm hiểu cách sử dụng Secret Manager API trong Java.
Tìm hiểu thêm
- Dự án Spring trên GCP: http://cloud.spring.io/spring-cloud-gcp/
- Kho lưu trữ Spring trên GCP GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java trên Google Cloud: https://cloud.google.com/java/
- Kiểm soát quyền truy cập vào các giá trị bí mật trong Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Ghi nhật ký kiểm tra trong Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.