Azure Web Appsお勉強メモ(7)データベース接続情報などをAzure Key Vaultから取得する

はじめに

先日からAzure Web Appsをお勉強することをやっています。今回は、これまでとはちょっと毛色を変えて、データベース接続情報などをAzure Key Vaultから取得することをやってみます。

これまでの内容は以下を参照してください。

参考となる記事

パスワードなどを一元管理するのに、Azure Key Vaultというサービスがあります。

docs.microsoft.com

これをSpring Bootで使う上でのチュートリアルも以下で公開されています。

docs.microsoft.com

今回はこのチュートリアルをベースに実施してみます。

前提条件

以下の環境で実装しました。

  • 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の設定を「オン」にします。

f:id:miyohide:20210815153719p:plain

次にAzure Key Vaultのアクセスポリシーにて一覧と読み込みの権限を付与します。上記のIDの設定を行うことで、Azure Web appsの名前でサービスプリンシパルが作られているので、それに権限を付与してあげれば良いです。

f:id:miyohide:20210815153959p:plain

チュートリアルでは、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-idtenant-idの指定はしなくてもよいみたいな記述があるので、ひょっとしたら不要かも...。とりあえずここでは指定しておきます。

あとはこれらの環境変数をAzure Web Apps上のアプリケーション設定で設定してあげれば良いです。

f:id:miyohide:20210815154909p:plain

プログラムからAzure Key Vaultに登録したシークレットの値を見るためには、以下のような記述をすれば良いようです。

@Value("${シークレットの名前}")
private String secretValue;

これでsecretValueにシークレットの値が入ります。

データベースの接続情報をAzure Key Vaultから取得してプログラムに反映する。

上記の作業でAzure Key Vaultから値を読み取ることができました。次はデータベースの接続情報をAzure Key Vaultから取得したいと思います。以下のようにユーザー名やパスワード、接続先を設定しておきます。

f:id:miyohide:20210815155755p:plain

Spring Bootにおいて、データベースの接続先情報はapplication.propertiesにてspring.datasource.urlなどで指定することが一般的です。

docs.spring.io

今回のようにプログラムから設定するにはどうすればいいんだろう?と思っていたら、ちょうどよい記事がありました。

www.baeldung.com

この記事を参考に、以下のように実装しました。

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です。

f:id:miyohide:20210815160606p:plain

ソースコード

ソースコードはこちら。

github.com