Mengambil Kredensial/Secrets dari Secret Manager dengan Spring Boot

1. Ringkasan

Rahasia seperti sandi dan kunci API adalah informasi sensitif yang harus disimpan dalam penyimpanan terenkripsi yang aman, akses terkontrol, dan dapat diaudit. Beberapa sistem memilih menggunakan Vault untuk menyimpan rahasia ini. Di Google Cloud, Anda dapat menggunakan Secret Manager, sebuah layanan terkelola, untuk menyimpan secret dengan aman, dan mengontrol akses ke setiap secret menggunakan IAM.

Di Spring Boot, Anda dapat menggunakan Spring Cloud GCP untuk mengakses rahasia ini dengan mudah dengan menyebutnya sebagai properti Spring lainnya.

Dalam codelab ini, Anda akan menyimpan secret di Secret Manager, lalu membangun microservice Spring Boot sederhana dan mengambil secret.

Yang akan Anda pelajari

  • Cara membuat aplikasi Java Spring Boot dan mengonfigurasi Secret Manager.

Yang Anda butuhkan

  • Project Google Cloud
  • Browser, seperti Chrome atau Firefox
  • Pemahaman tentang editor teks Linux standar seperti Vim, EMACs, atau Nano

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana Anda menilai pengalaman Anda membuat aplikasi web HTML/CSS?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Google Cloud Shell

Meskipun layanan Google Cloud dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser atau Chromebook.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Mengonfigurasi Secret

Untuk menggunakan Secret Manager, aktifkan API terlebih dahulu:

$ gcloud services enable secretmanager.googleapis.com

Lalu, buat secret bernama greeting, dengan nilai Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

Perintah ini menggunakan STDIN untuk memberikan nilai ke command line. Namun, Anda juga dapat memasukkan nilai rahasia dalam file, yang menentukan nama file untuk argumen --data-file.

Anda dapat membuat daftar semua secret menggunakan gcloud CLI:

$ gcloud secrets list

4. Membuat Layanan REST Spring Boot baru

Setelah Cloud Shell diluncurkan, Anda dapat menggunakan command line untuk membuat aplikasi Spring Boot baru dengan 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

Di pom.xml, tambahkan dependensi starter GCP Spring Cloud:

pom.xml

<project>
  ...

  <dependencies>
    ...
    <!-- Add Secret Manager Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
    </dependency>
  </dependencies>

  ...
</project>

Di file src/main/resources/application.properties, tambahkan konfigurasi berikut untuk mengaktifkan Spring Boot Config Data API.:

spring.config.import=sm://

Tindakan ini akan mengonfigurasi Sumber Properti Spring, sehingga Anda dapat merujuk ke secret menggunakan nilai properti, dengan awalan sm://, misalnya, sm://greeting.

Lihat dokumentasi Secret Manager GCP Spring Cloud untuk detail selengkapnya tentang format properti. Perhatikan bahwa persyaratan application.properties baru di Spring Cloud GCP 4.x. Baca detail selengkapnya dalam panduan migrasi.

Buat pengontrol REST baru dengan menambahkan file class baru:

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!";
  }
}

Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot.

Pastikan JAVA_HOME disetel ke versi JDK yang benar:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Mari lewati pengujian untuk lab ini, dan mulai aplikasi:

$ ./mvnw -DskipTests spring-boot:run

Setelah aplikasi dimulai, klik ikon Web Preview e18df08334f0d809.png di toolbar Cloud Shell dan pilih preview di port 8080.

Setelah menunggu sebentar, Anda akan melihat hasilnya:

1e9a7884ff113c14.pngS

5. Mengambil Secret

Anda dapat menggunakan anotasi @Value untuk merujuk ke properti rahasia menggunakan awalan sm://.

Di class HelloSecretController, masukkan nilai greeting menggunakan anotasi:

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot. Mari lewati pengujian untuk lab ini:

$ ./mvnw -DskipTests spring-boot:run

Setelah aplikasi dimulai, klik ikon Web Preview e18df08334f0d809.png di toolbar Cloud Shell dan pilih preview di port 8080.

Setelah menunggu sebentar, Anda akan melihat hasilnya:

Screenshot aplikasi yang sedang berjalan, yang menampilkan &#39;Hello World!&#39;

Anda juga dapat memetakan nilai ke properti di application.properties:

src/main/resources/application.properties

greeting=${sm://greeting}

Di HelloSecretController, Anda dapat merujuk ke nama properti yang lebih umum ini, bukan nama Secret Manager:

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot. Mari lewati pengujian untuk lab ini:

$ ./mvnw -DskipTests spring-boot:run

Setelah aplikasi dimulai, klik ikon Web Preview Ikon Web Preview di toolbar Cloud Shell dan pilih preview di port 8080.

Memperbarui nilai secret

Dengan sintaksis singkat sm://greeting, Anda otomatis menggunakan rahasia versi terbaru. Dengan membuat versi rahasia yang baru, Anda bisa mengupdate aplikasi tanpa mengubah kode Anda.

Update nilai rahasia dengan menambahkan versi baru:

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

Mulai ulang aplikasi dan lihat versi rahasia yang baru ditampilkan.

Screenshot aplikasi yang sedang berjalan, yang menampilkan &#39;Greeings World!&#39;

Memperluas konsep ini

Teknik ini berguna terutama jika Anda menggunakan profil aplikasi Spring Boot yang berbeda. Misalnya, Anda dapat membuat secret seperti greeting-dev, greeting-staging, greeting-prod. Dan di setiap profil, petakan ke salam yang tepat.

Buat rahasia greeting-prod:

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

Buat file application-prod.properties:

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

Anda dapat memulai aplikasi Spring Boot seperti biasa dengan plugin Spring Boot, tetapi dengan profil prod. Mari lewati pengujian untuk lab ini:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

Setelah aplikasi dimulai, klik ikon Web Preview Ikon Web Preview di toolbar Cloud Shell dan pilih preview di port 8080.

Setelah menunggu sebentar, Anda akan melihat hasilnya:

Screenshot aplikasi yang sedang berjalan, yang menampilkan &#39;Hola World!&#39;

6. Ringkasan

Di lab ini, Anda telah membuat layanan yang dapat dikonfigurasi menggunakan secret yang disimpan di Secret Manager menggunakan nama properti Spring yang diawali dengan sm:// dan memasukkan nilai dari file applications.properties dan anotasi @Value.

7. Selamat!

Anda telah mempelajari cara menggunakan Secret Manager API di Java.

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.