はじめに
先日からAzure Web Appsをお勉強することをやっています。今回は、これまでとはちょっと毛色を変えて、データベース接続情報などをAzure Key Vaultから取得することをやってみます。
これまでの内容は以下を参照してください。
- Azure Web Appsお勉強メモ(1)Azure Web AppsにてRailsアプリを動かす(2021年6月版) - miyohide's blog
- Azure Web Appsお勉強メモ(2)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする - miyohide's blog
- Azure Web Appsお勉強メモ(3)Azure Web AppsにてデプロイするDockerイメージをGitHub Actionsで作成してAzure Container Registryにpushする(2) - miyohide's blog
- Azure Web Appsお勉強メモ(4)Azure Web AppsにてデプロイするDockerイメージをAzure DevOpsで生成してAzure Container Registryに登録する - miyohide's blog
- Azure Web Appsお勉強メモ(5)Azure Web AppsにてデプロイしたDockerイメージにSSH接続する - miyohide's blog
- Azure Web Appsお勉強メモ(6)Azure Container RegistryにpushしたらAzure Web Appsにデプロイする - miyohide's blog
参考となる記事
パスワードなどを一元管理するのに、Azure Key Vaultというサービスがあります。
これをSpring Bootで使う上でのチュートリアルも以下で公開されています。
今回はこのチュートリアルをベースに実施してみます。
前提条件
以下の環境で実装しました。
- Spring Boot 2.5.3
- PostgreSQL 13.3
- Azure Key Vault Secrets Spring Boot starter client library for Java 3.6.0
Azure Key Vaultからデータを読み取る
上記のチュートリアルのとおりやっていけばAzure Key Vaultからデータを取得することができますが、チュートリアルはコマンドでやっているので、ちょっとわかりにくいです。Azure Portalでは以下の感じで設定します。
まずは動かしているAzure Web AppsでIDの設定を「オン」にします。
次にAzure Key Vaultのアクセスポリシーにて一覧と読み込みの権限を付与します。上記のIDの設定を行うことで、Azure Web appsの名前でサービスプリンシパルが作られているので、それに権限を付与してあげれば良いです。
チュートリアルでは、application.properties
にテナントIDやらをそのまま書き込んでいますが、それだとAzure Key Vaultにパスワードなどを格納する意味はないので、環境変数を参照するようにします。
azure.keyvault.client-id=${KEYVAULT_CLIENT_ID} azure.keyvault.enabled=true azure.keyvault.tenant-id=${KEYVAULT_TENANT_ID} azure.keyvault.uri=${KEYVAULT_URL}
なお、Azure Key Vault Secrets Spring Boot starter client library for Javaのドキュメントにはclient-id
やtenant-id
の指定はしなくてもよいみたいな記述があるので、ひょっとしたら不要かも...。とりあえずここでは指定しておきます。
あとはこれらの環境変数をAzure Web Apps上のアプリケーション設定で設定してあげれば良いです。
プログラムからAzure Key Vaultに登録したシークレットの値を見るためには、以下のような記述をすれば良いようです。
@Value("${シークレットの名前}") private String secretValue;
これでsecretValue
にシークレットの値が入ります。
データベースの接続情報をAzure Key Vaultから取得してプログラムに反映する。
上記の作業でAzure Key Vaultから値を読み取ることができました。次はデータベースの接続情報をAzure Key Vaultから取得したいと思います。以下のようにユーザー名やパスワード、接続先を設定しておきます。
Spring Bootにおいて、データベースの接続先情報はapplication.properties
にてspring.datasource.url
などで指定することが一般的です。
今回のようにプログラムから設定するにはどうすればいいんだろう?と思っていたら、ちょうどよい記事がありました。
この記事を参考に、以下のように実装しました。
package com.github.miyohide.appwithkeyvault; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class DataSourceConfig { @Value("${app-database-url}") private String databaseUrl; @Value("${app-database-user}") private String databaseUser; @Value("${app-database-password}") private String databasePassword; @Bean public DataSource getDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.url(this.databaseUrl); dataSourceBuilder.username(this.databaseUser); dataSourceBuilder.password(this.databasePassword); return dataSourceBuilder.build(); } }
あとはプログラムをデプロイして動作を確認して、データベースから値を取得することが確認できればOKです。
ソースコード
ソースコードはこちら。