1. Übersicht
Secrets wie Passwörter oder API-Schlüssel sind vertrauliche Informationen, die an einem sicheren, verschlüsselten Speicher mit Zugriffssteuerung und prüfbaren Daten gespeichert werden sollten. Einige Systeme verwenden zum Speichern dieser Secrets Vault. In Google Cloud können Sie den verwalteten Dienst Secret Manager 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 andere Spring-Attribute angeben.
In diesem Codelab speichern Sie ein Secret in Secret Manager, erstellen dann einfache Spring Boot-Mikrodienste und rufen das Secret ab.
Aufgaben in diesem Lab
- Spring Boot-Java-Anwendung erstellen und Secret Manager konfigurieren.
Voraussetzungen
- Ein Google Cloud-Projekt
- Browser, z. B. Chrome oder Firefox
- Erfahrung mit standardmäßigen Linux-Texteditoren wie Vim, EMACs oder Nano
Wie möchten Sie diese Anleitung nutzen?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrung mit der Erstellung von HTML/CSS-Web-Apps bewerten?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud-Diensten bewerten?
<ph type="x-smartling-placeholder">2. Einrichtung und Anforderungen
Umgebung für das selbstbestimmte 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 ein Konto 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 in diesem Codelab später als PROJECT_ID
bezeichnet.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen nutzen zu können.
Dieses Codelab sollte ohne großen Aufwand betrieben werden. Folgen Sie der Anleitung im Abschnitt „Bereinigen“, . Hier erfahren Sie, wie Sie Ressourcen herunterfahren, damit Ihnen über dieses Tutorial hinaus keine Kosten entstehen. Neue Google Cloud-Nutzer können an einem kostenlosen Testzeitraum mit 300$Guthaben teilnehmen.
Google Cloud Shell
Google Cloud-Dienste können Sie auch per Fernzugriff von Ihrem Laptop aus bedienen. In diesem Codelab verwenden wir jedoch Google Cloud Shell, 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 zum ersten Mal verwenden, wird ein Zwischenbildschirm (below the fold) angezeigt, in dem beschrieben wird, worum es sich dabei handelt. Klicken Sie in diesem Fall auf Weiter. Der Chat wird nie wieder angezeigt. So sieht dieser einmalige Bildschirm aus:
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.
Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können Sie ganz einfach mit einem Browser oder Ihrem Chromebook erledigen.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID eingestellt ist.
- Führen Sie in 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
Aktivieren Sie zuerst die API, um Secret Manager zu verwenden:
$ 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 an die Befehlszeile bereitzustellen. Sie können den Secret-Wert aber auch einfach in einer Datei speichern und den Dateinamen für das Argument --data-file
angeben.
Sie können alle Secrets mit der gcloud CLI auflisten:
$ gcloud secrets list
4. Neuen Spring Boot REST-Dienst erstellen
Nach dem Start von Cloud Shell können Sie die Befehlszeile verwenden, um mit Spring Initializr eine neue Spring Boot-Anwendung zu 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 in 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 die folgende Konfiguration in die Datei src/main/resources/application.properties
ein, um die Spring Boot Config Data API zu aktivieren:
spring.config.import=sm://
Dadurch wird eine Spring-Property-Quelle konfiguriert, sodass Sie mithilfe eines Property-Werts mit dem Präfix sm://
auf Secrets verweisen können, z. B. sm://greeting
.
Weitere Informationen zum Format von Attributen finden Sie in der Dokumentation zu Secret Manager von Spring Cloud GCP. Die application.properties
-Anforderung ist in Spring Cloud GCP 4.x neu. Weitere Informationen finden Sie im Migrationsleitfaden.
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 normal mit dem Spring Boot-Plug-in starten.
Prüfen Sie, ob für JAVA_HOME die richtige JDK-Version festgelegt ist:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Wir überspringen die Tests für dieses Lab und starten die Anwendung:
$ ./mvnw -DskipTests spring-boot:run
Klicken Sie nach dem Start der Anwendung in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau und wählen Sie Vorschau auf Port 8080 aus.
Nach einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:
5. Secret abrufen
Sie können die Annotation @Value
verwenden, um mit dem Präfix sm://
auf das Secret-Attribut zu verweisen.
In die HelloSecretController-Klasse fügen Sie den Wert greeting
mithilfe 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 normal mit dem Spring Boot-Plug-in starten. In diesem Lab überspringen wir die Tests:
$ ./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 einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:
Sie können den Wert auch einer Eigenschaft in application.properties
zuordnen:
src/main/resources/application.properties
greeting=${sm://greeting}
In HelloSecretController können Sie auf diesen allgemeineren Attributnamen anstatt auf einen Secret Manager-Namen verweisen:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten. In diesem Lab überspringen wir die Tests:
$ ./mvnw -DskipTests spring-boot:run
Klicken Sie nach dem Start der Anwendung in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau und wählen Sie Vorschau auf Port 8080 aus.
Secret-Wert aktualisieren
Mit der Kurzsyntax sm://greeting
verwenden Sie automatisch die neueste Version des Secrets. Wenn Sie eine neue Version des Secrets erstellen, können Sie Ihre Anwendung aktualisieren, ohne Ihren 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 und sehen Sie, wie die neue Version des Secrets zurückgegeben wird.
Erweiterung des Konzepts
Diese Technik ist besonders nützlich, wenn Sie verschiedene Spring Boot-Anwendungsprofile verwenden. Sie können beispielsweise Secrets wie greeting-dev
, greeting-staging
oder greeting-prod
erstellen. Ordnen Sie in 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 normal mit dem Spring Boot-Plug-in starten, jedoch mit dem Profil prod
. In diesem Lab überspringen wir die Tests:
$ ./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 einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:
6. Zusammenfassung
In diesem Lab haben Sie einen Dienst erstellt, der mit in Secret Manager gespeicherten Secrets konfiguriert werden kann. Dazu verwenden Sie die Attributnamen von Spring mit dem Präfix sm://
und fügen den Wert aus der Datei applications.properties
und den Annotationen @Value
ein.
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 von Spring auf 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.