1. Übersicht
Secrets wie Passwörter und API-Schlüssel sind vertrauliche Informationen, die in einem sicheren, verschlüsselten Speicher mit Zugriffskontrolle und Audit-Funktion gespeichert werden sollten. Einige Systeme verwenden Vault zum Speichern dieser Secrets. In Google Cloud können Sie Secret Manager, einen verwalteten Dienst, verwenden, um die Secrets sicher zu speichern und den Zugriff auf einzelne Secrets mit IAM zu steuern.
In Spring Boot können Sie mit Spring Cloud GCP ganz einfach auf diese Secrets zugreifen, indem Sie sie wie jede andere Spring-Eigenschaft referenzieren.
In diesem Codelab speichern Sie ein Secret in Secret Manager, erstellen dann einfache Spring Boot-Microservices und rufen das Secret ab.
Lerninhalte
- So erstellen Sie eine Spring Boot-Java-Anwendung und konfigurieren Secret Manager.
Voraussetzungen
- Google Cloud-Projekt
- Browser, z. B. Chrome oder Firefox
- Erfahrung mit standardmäßigen Linux-Texteditoren wie Vim, EMACs oder Nano
Wie werden Sie diese Anleitung verwenden?
Wie würden Sie Ihre Erfahrung mit der Entwicklung von HTML/CSS-Web-Apps bewerten?
Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?
2. Einrichtung und Anforderungen
Umgebung zum selbstbestimmten Lernen einrichten
- Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eines erstellen.
Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird später in diesem Codelab als PROJECT_ID bezeichnet.
- Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.
Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“, in der Sie erfahren, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.
Google Cloud Shell
Während Sie Google Cloud-Dienste von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.
Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren
.
Wenn Sie Cloud Shell noch nie gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:
Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.
Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser oder Ihrem Chromebook erledigt werden.
Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.
- Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
3. Secret konfigurieren
Um Secret Manager zu verwenden, müssen Sie zuerst die API aktivieren:
$ gcloud services enable secretmanager.googleapis.com
Erstellen Sie dann ein Secret mit dem Namen greeting und dem Wert Hello:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
Dieser Befehl verwendet STDIN, um den Wert für die Befehlszeile bereitzustellen. Sie können den Secret-Wert aber auch einfach in eine Datei einfügen und den Dateinamen für das --data-file-Argument angeben.
Mit der gcloud CLI können Sie alle Secrets auflisten:
$ gcloud secrets list
4. Neuen Spring Boot-REST-Dienst erstellen
Nachdem Cloud Shell gestartet wurde, können Sie über die Befehlszeile eine neue Spring Boot-Anwendung mit Spring Initializr generieren:
$ 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
Fügen Sie der Datei pom.xml die Spring Cloud GCP-Starterabhängigkeit hinzu:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Secret Manager Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
</dependency>
</dependencies>
...
</project>
Fügen Sie der Datei src/main/resources/application.properties die folgende Konfiguration hinzu, um die Spring Boot Config Data API zu aktivieren:
spring.config.import=sm://
Dadurch wird eine Spring-Attributquelle konfiguriert, sodass Sie mit dem Präfix sm:// auf Secrets verweisen können, z. B. sm://greeting.
Weitere Informationen zum Format der Property finden Sie in der Spring Cloud GCP Secret Manager-Dokumentation. Die Anforderung application.properties ist neu in Spring Cloud GCP 4.x. Weitere Informationen finden Sie in der Migrationsanleitung.
Erstellen Sie einen neuen REST-Controller, indem Sie eine neue Klassendatei hinzufügen:
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!";
}
}
Sie können die Spring Boot-Anwendung wie gewohnt mit dem Spring Boot-Plug-in starten.
Prüfen Sie, ob JAVA_HOME auf die richtige JDK-Version festgelegt ist:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Überspringen wir die Tests für dieses Lab und starten wir die Anwendung:
$ ./mvnw -DskipTests spring-boot:run
Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau
und wählen Vorschau auf Port 8080 aus.
Nach kurzer Zeit sollte das Ergebnis angezeigt werden:

5. Secret abrufen
Mit der Annotation @Value können Sie mit dem Präfix sm:// auf das Attribut „secret“ verweisen.
Fügen Sie in der Klasse „HelloSecretController“ den Wert greeting mit der Annotation ein:
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
Sie können die Spring Boot-Anwendung wie gewohnt mit dem Spring Boot-Plug-in starten. Wir überspringen die Tests für dieses Lab:
$ ./mvnw -DskipTests spring-boot:run
Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf "Web Preview" (Webvorschau)
und wählenPreview on port 8080 (Vorschau auf Port 8080) aus.
Nach kurzer Zeit sollte das Ergebnis angezeigt werden:

Sie können den Wert auch einem Attribut in application.properties zuordnen:
src/main/resources/application.properties
greeting=${sm://greeting}
In HelloSecretController können Sie auf diesen allgemeineren Property-Namen anstelle eines Secret Manager-Namens verweisen:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
Sie können die Spring Boot-Anwendung wie gewohnt mit dem Spring Boot-Plug-in starten. Wir überspringen die Tests für dieses Lab:
$ ./mvnw -DskipTests spring-boot:run
Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau
und wählen Vorschau auf Port 8080 aus.
Secret-Wert aktualisieren
Wenn Sie die Kurzschreibweise sm://greeting verwenden, wird automatisch die neueste Version des Secrets verwendet. Wenn Sie eine neue Version des Secrets erstellen, können Sie Ihre Anwendung aktualisieren, ohne den Code zu ändern.
Aktualisieren Sie den Wert des Secrets, indem Sie eine neue Version hinzufügen:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
Starten Sie die Anwendung neu. Die neue Version des Secrets wird zurückgegeben.

Dieses Konzept weiterentwickeln
Diese Technik ist besonders nützlich, wenn Sie verschiedene Spring Boot-Anwendungsprofile verwenden. Sie können beispielsweise Secrets wie greeting-dev, greeting-staging und greeting-prod erstellen. Ordnen Sie jedem Profil die richtigen Begrüßungen zu.
Erstellen Sie ein greeting-prod-Secret:
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
Erstellen Sie eine application-prod.properties-Datei:
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
Sie können die Spring Boot-Anwendung mit dem Spring Boot-Plug-in wie gewohnt starten, aber mit dem Profil prod. Wir überspringen die Tests für dieses Lab:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf "Web Preview" (Webvorschau)
und wählenPreview on port 8080 (Vorschau auf Port 8080) aus.
Nach kurzer Zeit sollte das Ergebnis angezeigt werden:

6. Zusammenfassung
In diesem Lab haben Sie einen Dienst erstellt, der mithilfe von Secrets konfiguriert werden kann, die in Secret Manager gespeichert sind. Dazu haben Sie die Eigenschaftsnamen von Spring mit sm:// versehen und den Wert aus der Datei applications.properties und den Annotationen @Value eingefügt.
7. Glückwunsch!
Sie haben gelernt, wie Sie die Secret Manager API in Java verwenden.
Weitere Informationen
- Spring on GCP-Projekt: http://cloud.spring.io/spring-cloud-gcp/
- GitHub-Repository für Spring on GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java in Google Cloud: https://cloud.google.com/java/
- Zugriff auf Secrets in Secret Manager steuern: https://cloud.google.com/secret-manager/docs/access-control
- Audit-Logging in Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.