このチュートリアルでは、Spring Boot アプリケーションでKey Vaultを使用して、機密性の高い構成データをセキュリティで保護し、Key Vaultから構成プロパティを取得する方法について説明します。 Key Vault は、パスワードやデータベース接続文字列などの汎用シークレットの安全なストレージを提供します。
前提条件
- Azure サブスクリプション - 無料で作成。
- Java Development Kit (JDK) バージョン 8 以降。
- Apache Maven
- Azure CLI
- Key Vault インスタンス。 お持ちでない場合は、「
Quickstart: Azure ポータルを使用してキー コンテナーを作成する」を参照>。 また、このチュートリアルのテスト アプリケーションに必要なKey Vault インスタンスの URI も書き留めておきます。 - Spring Boot アプリケーション。 まだない場合は、 Spring Initializr を使用して Maven プロジェクトを作成します。 必ず Maven Project を選択し、DependenciesSpring Web、Spring Data JPA、および H2 Database 依存関係を追加し、バージョン 8 以降Java選択します。
重要
この記事の手順を完了するには、Spring Boot 2.5 以降のバージョンが必要です。
シークレットを Azure Key Vault に設定する
このチュートリアルでは、Spring Boot アプリケーションでKey Vaultからデータベース資格情報を読み取る方法について説明します。 Key Vaultから資格情報を読み取るために、最初にデータベース資格情報をKey Vaultに格納する必要があります。
H2 データベースの URL を新しいシークレットとしてKey Vaultに格納するには、「Quickstart: Azure ポータルを使用してAzure Key Vaultからシークレットを設定および取得するを参照してください。 このチュートリアルでは、名前 と値 を使用してシークレットを設定します。
メモ
シークレットを設定した後、Key Vault アクセス ポリシーの割り当ての手順に従って、アプリにKey Vaultへのアクセス権を付与します。
Azure Key Vaultからシークレットを読み取る
データベース資格情報がKey Vaultに格納されたので、Spring Cloud Azureで取得できます。
Spring Cloud Azure Key Vault Starter モジュールをインストールするには、次の依存関係を pom.xml ファイルに追加します。
Spring Cloud Azure部品表 (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>7.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>メモ
Spring Boot 4.0.x を使用している場合は、必ず バージョンを に設定してください。
Spring Boot 3.5.x を使用している場合は、必ず バージョンを に設定してください。
Spring Boot 3.1.x-3.5.x を使用している場合は、必ず バージョンを に設定してください。
Spring Boot 2.xを使用している場合は、 バージョンを に設定してください。
部品表(BOM)は、ファイルのセクションで設定する必要があります。 これにより、すべての Spring Cloud Azure依存関係で同じバージョンが使用されるようになります。
この BOM に使用されるバージョンの詳細については、「どのバージョンの Spring Cloud Azure を使用すべきですか?」を参照してください。
Spring Cloud Azure Key Vault Starter アーティファクト:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-keyvault</artifactId> </dependency>
Spring Cloud Azure には、Key Vaultからシークレットを読み取るためのいくつかの方法があります。 次の方法を個別に使用することも、さまざまなユース ケースに合わせて組み合わせて使用することもできます。
- Key VaultにはAzure SDKを使用します。
- Spring KeyVault を使用します。
Key VaultにAzure SDKを使用する
Key VaultのAzure SDKでは、Key Vaultでシークレットを管理するための SecretClient が提供されます。
次のコード例では、SecretClient を使用して、Azure Key Vaultから H2 データベース資格情報を取得する方法を示します。
Key VaultからAzure SDKを使用してシークレットを読み取るために、次の手順に従ってアプリケーションを構成します。
application.properties 構成ファイルでKey Vault エンドポイントを構成します。
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/次の例に示すように、Spring アプリケーションに Bean を挿入し、 メソッドを使用してシークレットを取得します。
import com.azure.security.keyvault.secrets.SecretClient; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SecretClientApplication implements CommandLineRunner { // Spring Cloud Azure will automatically inject SecretClient in your ApplicationContext. private final SecretClient secretClient; public SecretClientApplication(SecretClient secretClient) { this.secretClient = secretClient; } public static void main(String[] args) { SpringApplication.run(SecretClientApplication.class, args); } @Override public void run(String... args) { System.out.println("h2url: " + secretClient.getSecret("h2url").getValue()); } }ヒント
このチュートリアルでは、構成またはコードに認証操作はありません。 ただし、Azure サービスに接続するには認証が必要です。 認証を完了するには、Azure ID を使用する必要があります。 Spring Cloud Azureでは
DefaultAzureCredentialを使用します。これは、コードを変更せずに資格情報を取得するのに役立つAzure ID ライブラリが提供します。は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境など) で異なる認証方法をアプリに使用できます。 詳細については、「 DefaultAzureCredential」を参照してください。
ローカル開発環境で認証を完了するには、Azure CLI、Visual Studio Code、PowerShell、またはその他の方法を使用できます。 詳細については、「Java開発環境での Azure 認証を参照してください。 Azureホスティング環境で認証を完了するには、ユーザー割り当てマネージド ID を使用することをお勧めします。 詳細については、「Azure リソースのマネージド ID とは」を参照してください>
アプリケーションを起動します。 次の例のようなログが表示されます。
h2url: jdbc:h2:~/testdb;user=sa;password=password
自分で Bean をビルドできますが、プロセスは複雑です。 Spring Boot アプリケーションでは、プロパティを管理し、ビルダー パターンを学習し、Spring アプリケーション コンテキストにクライアントを登録する必要があります。 次のコード例は、 Bean をビルドする方法を示しています。
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SecretClientConfiguration {
@Bean
public SecretClient createSecretClient() {
return new SecretClientBuilder()
.vaultUrl("https://<your-key-vault-url>.vault.azure.net/")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
}
}
次の一覧は、このコードが柔軟でもグレースフルでもない理由の一部を示しています。
- Key Vault エンドポイントはハード コーディングされています。
- を使用して Spring 環境から構成を取得する場合、application.properties ファイルに IDE ヒントを含めることはできません。
- マイクロサービス シナリオがある場合は、各プロジェクトでコードを複製する必要があり、間違いを犯しやすく、一貫性を保つのは困難です。
幸いなことに、Spring Cloud Azureでは、SecretClient Bean を自分で構築する必要はありません。 代わりに、SecretClientを直接挿入し、既に使い慣れている構成プロパティを使用してKey Vaultを構成できます。 詳細については、「 構成の例」を参照してください。
Spring Cloud Azureでは、さまざまなシナリオに対して次のグローバル構成も提供されます。 詳細については、「
- プロキシ オプション。
- 再試行オプション。
- HTTP トランスポート クライアント オプション。
異なるAzure クラウドに接続することもできます。 詳細については、「異なるAzure クラウドに接続するを参照してください。
Spring Key Vault PropertySource を使用する
前のセクションでは、アプリケーションの起動後にシークレットを読み取るために を で使用する方法を示しました。 ただし、Spring Boot アプリケーションでは、アプリケーションを開始する前にシークレットの読み取りが必要です。 たとえば、アプリケーションを開始する前に、データソースのパスワード プロパティが必要です。 前のシナリオは、データソースのパスワードをKey Vaultに格納し、Spring 自動構成を使用してデータソースを取得する場合は機能しません。
この場合、Spring Cloud Azure は、アプリケーション コンテキストを構築する前に、Key Vaultからシークレットを読み込む Spring 環境統合を提供します。 シークレットを使用して、Spring アプリケーション コンテキストの初期化中に Bean を構築および構成できます。 この方法は、Key Vaultからシークレットにアクセスするための透過的な方法であり、コードの変更は必要ありません。
次のコード例では、PropertySource を使用して H2 データベース資格情報を取得し、Azure Key Vaultからデータソースを構築する方法を示します。
Key Vaultから H2 データベースの URL を取得し、Spring Data JPA を使用して H2 データベースからデータを格納するには、次の手順に従ってアプリケーションを構成します。
application.properties 構成ファイルに、次のKey Vaultエンドポイントとデータソースのプロパティを追加します。
logging.level.org.hibernate.SQL=DEBUG spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://<your-keyvault-name>.vault.azure.net/ spring.datasource.url=${h2url} spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.H2Dialectヒント
Spring Cloud Azure プロパティの構成の例については、
Spring Cloud Azure 開発者ガイドの「 」セクションを参照してください。Configuration examples この例は、H2 データベースを使用する単純なデータベース シナリオです。 運用環境でAzure Database for MySQLまたはAzure Database for PostgreSQLを使用し、データベースの URL、ユーザー名、パスワードをAzure Key Vaultに格納することをお勧めします。 パスワードを回避する場合は、パスワードレス接続をお勧めします。 詳細については、Azure サービスの Passwordless 接続を参照してください。
新しい
TodoJava クラスを作成します。 このクラスは、JPA によって自動的に作成される、 テーブルにマップされたドメイン モデルです。 次のコードは、 メソッドと メソッドを無視します。import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @Entity public class Todo { public Todo() { } public Todo(String description, String details, boolean done) { this.description = description; this.details = details; this.done = done; } @Id @GeneratedValue private Long id; private String description; private String details; private boolean done; }スタートアップ クラス ファイルを編集して、次の内容を表示します。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.JpaRepository; import java.util.stream.Stream; @SpringBootApplication public class KeyvaultApplication { public static void main(String[] args) { SpringApplication.run(KeyvaultApplication.class, args); } @Bean ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) { return event->repository .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up " + "correctly!", true)).toList()) .forEach(System.out::println); } } interface TodoRepository extends JpaRepository<Todo, Long> { }アプリケーションを起動します。 アプリケーションは、Key Vaultから H2 データベースの URL を取得し、H2 データベースに接続して、データベースにデータを格納します。 次の例のようなログが表示されます。
2023-01-13 15:51:35.498 DEBUG 5616 --- [main] org.hibernate.SQL: insert into todo (description, details, done, id) values (?, ?, ?, ?) com.contoso.keyvault.Todo@1f
Azure Spring Appsにデプロイする
Spring Boot アプリケーションがローカルで実行されたので、運用環境に移行します。 Azure Spring Apps を使用すると、コードを変更することなく、Spring Boot アプリケーションをAzureに簡単にデプロイできます。 Spring アプリケーションのインフラストラクチャはこのサービスによって管理されるため、開発者はコードに専念できます。 Azure Spring Appsでは、包括的な監視と診断、構成管理、サービス検出、CI/CD 統合、ブルーグリーンデプロイなどを使用したライフサイクル管理が提供されます。 アプリケーションをAzure Spring Appsにデプロイするには、「初めてのアプリケーションを Azure Spring Apps にデプロイする」を参照してください。
次のステップ
spring 開発者向けのAzureSpring Cloud Azure KeyVault サンプル