services:
vault:
container_name: "guide-vault"
image: hashicorp/vault:latest
environment:
VAULT_DEV_ROOT_TOKEN_ID: "00000000-0000-0000-0000-000000000000"
ports:
- "8200:8200"Vault 構成
このガイドでは、Spring Cloud Vault (英語) を使用して、HashiCorp Vault (英語) から構成プロパティを取得するアプリケーションを構築するプロセスを順を追って説明します。
構築するもの
Vault を起動し、Vault 内に構成プロパティを保存し、Spring アプリケーションを構築して、Vault と接続します。
必要なもの
約 15 分
Eclipse STS や IntelliJ IDEA のような任意の IDE または VSCode のようなテキストエディター
Java 17 以降
このガイドを完了する方法
ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了することも、このリポジトリ [GitHub] (英語) のコードを確認してソリューションに直接進むこともできます。
ローカル環境で最終結果を確認するには、次のいずれかを実行します。
このガイドのソースリポジトリをダウンロードして解凍します
Git を使用してリポジトリをクローンする:
git clone https://github.com/spring-guides/gs-vault-config.gitリポジトリをフォークして、プルリクエストを送信することでこのガイドの変更をリクエストできるようにします。
Spring Initializr から開始
IDE を使用する場合はプロジェクト作成ウィザードを使用します。IDE を使用せずにコマンドラインなどで開発する場合は、この事前に初期化されたプロジェクトからプロジェクトを ZIP ファイルとしてダウンロードできます。このプロジェクトは、このチュートリアルの例に合うように構成されています。
プロジェクトを手動で初期化するには:
IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。
Gradle または Maven のいずれかと、使用する言語を選択します。このガイドは、Java を選択したことを前提としています。
依存関係をクリックし、Vault 構成を選択します
生成をクリックします。
結果として得られる ZIP ファイルをダウンロードします。これは、選択した内容で構成されたアプリケーションのアーカイブです。
実行 HashiCorp Vault
このガイドを完了するには、HashiCorp Vault のインスタンスが必要です。このガイドでは、Docker Compose を使用して、HashiCorp Vault のコンテナー化されたバージョンを実行します。compose.yaml ファイルが提供されています。
docker compose up コマンドを使用して HashiCorp Vault コンテナーを実行します。
Vault のストア構成
Vault は、保存時に暗号化された機密データを保存できる秘密管理システムです。
データを保存するには、Vault コンテナーにアクセスする必要があります。次のコマンドを使用して、実行中の Docker コンテナーに接続します。
docker exec -it guide-vault shこれで、HashiCorp Vault コンテナー内でコマンドが実行されるようになりました。
最初に、Vault CLI が Vault エンドポイントを指すように 2 つの環境変数を設定し、認証トークンを提供する必要があります。
export VAULT_TOKEN="00000000-0000-0000-0000-000000000000"
export VAULT_ADDR="http://127.0.0.1:8200"これで、Vault 内に構成のキーと値のペアを保存できるようになりました。このガイドでは、次の 2 つのキーと値のペアを保存します。
vault kv put secret/gs-vault-config example.username=demouser example.password=demopassword
vault kv put secret/gs-vault-config/cloud example.username=clouduser example.password=cloudpassword これで、Vault secret/gs-vault-config および secret/gs-vault-config/cloud に 2 つのエントリを作成しました。
Vault コンテナーが実行され、データがロードされたら、Spring アプリケーションに注意を向けることができます。
構成クラスを定義する
Spring アプリケーションの単純な構成を作成します。
src/main/java/hello/MyConfiguration.java
package hello;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author Mark Paluch
*/
@ConfigurationProperties("example")
public class MyConfiguration {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}アプリケーションを構成する
ここでは、application.properties を使用してアプリケーションを構成します。以下のコードは、Vault から構成をインポートできる Spring Boot の ConfigDataAPI を使用しています。
src/main/resources/application.properties
spring.application.name=gs-vault-config
spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true
spring.config.import: vault://アプリケーションクラスを作成する
ここで、すべてのコンポーネントを含む Application クラスを作成します。
src/main/java/hello/Application.java
package hello;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties(MyConfiguration.class)
public class Application implements CommandLineRunner {
private final MyConfiguration configuration;
public Application(MyConfiguration configuration) {
this.configuration = configuration;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
Logger logger = LoggerFactory.getLogger(Application.class);
logger.info("----------------------------------------");
logger.info("Configuration properties");
logger.info(" example.username is {}", configuration.getUsername());
logger.info(" example.password is {}", configuration.getPassword());
logger.info("----------------------------------------");
}
}Spring Cloud Vault は VaultOperations を使用して Vault と対話します。Vault のプロパティは、型安全アクセスのために MyConfiguration にマップされます。@EnableConfigurationProperties(MyConfiguration.class) は、構成プロパティのマッピングを有効にし、MyConfiguration Bean を登録します。
Application には、MyConfiguration のインスタンスをオートワイヤーする main() メソッドが含まれています。
アプリケーションの実行
メインメソッドは IDE から実行できます。または、./gradlew bootRun コマンドと ./mvnw spring-boot:run コマンドを使用してアプリケーションを起動することもできます。
Application は CommandLineRunner を実装しているため、Boot 開始時に run メソッドが自動的に呼び出されます。出力は次のようになります。
----------------------------------------
Configuration properties
example.username is demouser
example.password is demopassword
---------------------------------------- ここで、cloud プロファイルを使用してアプリケーションを起動します。Gradle では ./gradlew bootRun --args='--spring.profiles.active=cloud' コマンドを使用して、Maven では ./mvnw spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=cloud" コマンドを使用して起動できます。クラウドプロファイルを使用してアプリケーションを実行すると、次のように表示されます。
----------------------------------------
Configuration properties
example.username is clouduser
example.password is cloudpassword
---------------------------------------- 構成プロパティは、アクティブ化されたプロファイルに従ってバインドされます。Spring Cloud Vault は、gs-vault である spring.application.name から Vault コンテキストパスを構築し、プロファイル名(cloud)を追加するため、cloud プロファイルが secret/gs-vault-config/cloud から追加の構成プロパティをフェッチします。
アプリケーションの構築
このセクションでは、このガイドを実行するさまざまな方法について説明します。
アプリケーションの実行方法に関係なく、出力は同じになります。
アプリケーションを実行するには、アプリケーションを実行可能ファイル jar としてパッケージ化できます。./mvnw clean package コマンドは、アプリケーションを実行可能ファイル jar にコンパイルします。その後、java -jar target/gs-vault-config-0.0.1-SNAPSHOT.jar コマンドを使用して jar を実行できます。
あるいは、Docker 環境が利用可能な場合は、buildpacks を使用して、Maven または Gradle プラグインから直接 Docker イメージを作成できます。Cloud Native Buildpacks を使用すると、どこでも実行できる Docker 互換イメージを作成できます。Spring Boot には、Maven と Gradle の両方に対する buildpack のサポートが直接含まれています。つまり、コマンドを 1 つ入力するだけで、ローカルで実行されている Docker デーモンに適切なイメージをすばやく取り込むことができます。Cloud Native Buildpacks を使用して Docker イメージを作成するには、./mvnw spring-boot:build-image コマンドを実行します。Docker 環境が有効になっている場合は、docker run --network container:guide-vault docker.io/library/gs-vault-config:0.0.1-SNAPSHOT コマンドを使用してアプリケーションを実行できます。
--network フラグは、外部コンテナーが使用している既存のネットワークにガイドコンテナーを接続するように Docker に指示します。詳細については、Docker ドキュメント (英語) を参照してください。 |
ネイティブイメージのサポート
Spring Boot は、マシンに GraalVM ディストリビューションがインストールされている場合、ネイティブイメージへのコンパイルもサポートします。
次に、./mvnw -Pnative native:compile コマンドを実行してネイティブイメージを生成します。ビルドが完了したら、target/gs-vault-config コマンドを実行することで、ほぼ瞬時に起動してコードを実行できるようになります。
Maven を使用してネイティブイメージコンテナーを作成するには、pom.xml ファイルで spring-boot-starter-parent と org.graalvm.buildtools:native-maven-plugin が使用されていることを確認する必要があります。このプラグインは、<build> <plugins> セクションに配置する必要があります。
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>Buildpacks を使用したネイティブイメージを作成することもできます。./mvnw -Pnative spring-boot:build-image コマンドを実行してネイティブイメージを生成できます。ビルドが完了したら、docker run --network container:guide-vault docker.io/library/gs-vault-config:0.0.1-SNAPSHOT コマンドを使用してアプリケーションを起動できます。
要約
おめでとう! Vault サーバーをセットアップし、Spring Vault を使用して秘密を構成プロパティに読み取り、強力な暗号化でデータを暗号化する単純なアプリケーションを作成しました。鍵管理、暗号化モード、埋め込みの実装の頭痛はありません。
新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください [GitHub] (英語) 。
| すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の帰属、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。 |