Micronautの設定プロファイル切り替え完全ガイド!dev/test/prodの使い分け
生徒
「Micronautで開発環境やテスト環境、本番環境ごとに設定を変えたいです。どうやって設定プロファイルを切り替えるんですか?」
先生
「Micronautではapplication.ymlやapplication.propertiesで複数の設定プロファイルを定義できます。そして起動時に環境変数やコマンドライン引数でプロファイルを切り替えることができます。」
生徒
「具体的にどんな設定ファイルを書けばいいですか?」
先生
「基本的にはapplication.ymlに共通設定を書き、プロファイルごとの設定ファイルはapplication-{profile}.ymlとして用意します。起動時に--micronaut.environments=devなどを指定して切り替えます。」
1. 設定プロファイルとは?
Micronautの設定プロファイルとは、環境ごとに設定内容を切り替えるための仕組みです。たとえば、開発中はローカルのデータベース、本番では実際のサーバー用データベースを使いたい、といった場面で活躍します。プログラムのコードを変更せず、設定ファイルだけで動作を切り替えられるのが大きな特徴です。
基本となる設定はapplication.ymlにまとめて書き、環境ごとの差分だけをapplication-dev.ymlやapplication-prod.ymlといったファイルに分けて記述します。これにより「どの環境で、どんな設定が使われているのか」が一目で分かり、設定ミスも防ぎやすくなります。
プログラミング未経験の方でも、「共通ルールは1か所、環境ごとの違いは別ファイル」と覚えるだけでOKです。
▼ 共通設定の例(application.yml)
server:
port: 8080
▼ 開発環境だけポート番号を変えたい場合(application-dev.yml)
server:
port: 8081
このように設定しておくと、開発環境では8081番、本番環境では8080番と、起動する環境に応じて自動的に設定が切り替わります。設定プロファイルは、Micronautを安全かつ効率的に使うための基本中の基本と言えるでしょう。
2. application.ymlとプロファイル別設定の書き方
まず、共通設定をapplication.ymlに書きます。
micronaut:
application:
name: demo-app
server:
port: 8080
datasources:
default:
url: jdbc:h2:mem:devDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
次にプロファイルごとの設定をapplication-dev.ymlやapplication-prod.ymlに書きます。
# application-dev.yml
server:
port: 8081
datasources:
default:
url: jdbc:h2:mem:devDb;DB_CLOSE_DELAY=-1
username: devuser
password: devpass
# application-prod.yml
server:
port: 80
datasources:
default:
url: jdbc:mysql://prod-db:3306/proddb
username: produser
password: prodpass
こうすることで共通設定を維持しつつ、環境ごとの差分だけを書き換えられます。
3. プロファイルの切り替え方法
Micronautでは起動時にプロファイルを指定して環境を切り替えます。Gradleから起動する場合、次のようにコマンドを指定します。
./gradlew run --args='--micronaut.environments=dev'
./gradlew run --args='--micronaut.environments=prod'
また、環境変数を使うこともできます。
export MICRONAUT_ENVIRONMENTS=dev
./gradlew run
この方法により、同じコードベースで開発環境、テスト環境、本番環境の設定を切り替えながら実行可能です。
4. Javaコードからプロファイルごとの設定値を取得する
Micronautでは@Valueアノテーションや@ConfigurationPropertiesを使って、プロファイルごとの設定値を注入できます。
import jakarta.inject.Singleton;
import io.micronaut.context.annotation.Value;
@Singleton
public class AppConfigService {
@Value("${datasources.default.url}")
private String datasourceUrl;
public void printDatasource() {
System.out.println("Current datasource URL: " + datasourceUrl);
}
}
例えばdevプロファイルで起動すればdev用のURLが、prodプロファイルで起動すれば本番用のURLが自動的に注入されます。
5. 複数プロファイル同時利用と優先順位
Micronautでは複数のプロファイルを同時に指定することも可能です。その場合は後から指定したプロファイルが優先されます。
./gradlew run --args='--micronaut.environments=dev,test'
この場合、testプロファイルの設定がdevより優先されます。複雑な環境で微調整したい場合に便利です。
6. 実務での注意点
設定プロファイルを利用する際のポイントは以下の通りです。
- 共通設定はapplication.ymlに集約する
- 環境差分はapplication-{profile}.ymlに最小限で記述する
- プロファイルの切り替えはGradleのrunコマンドや環境変数で管理する
- Javaコードでは@Valueや@ConfigurationPropertiesで自動注入する
- 複数プロファイルを指定する場合、優先順位に注意する
SEOキーワード:Micronaut プロファイル切り替え、application-dev.yml、application-prod.yml、Java @Value、Gradle プロファイル指定、Micronaut dev test prod 環境設定
まとめ
ここまでMicronautにおける設定プロファイルの基本的な概念から、具体的な切り替え方法、そしてJavaコード内での活用術までを詳しく解説してきました。モダンなアプリケーション開発、特にマイクロサービスアーキテクチャやクラウドネイティブな開発において、環境ごとに設定値を柔軟に切り替えられる仕組みは不可欠です。Micronautのプロファイル管理機能を使いこなすことで、ソースコードを変更することなく、ローカル開発環境(dev)、継続的インテグレーションやユニットテストを行う環境(test)、そして実稼働する本番環境(prod)へと、スムーズにデプロイメントを進めることが可能になります。
Micronautの環境切り替えにおける重要ポイントの再確認
Micronautのプロファイル管理の核となるのは、命名規則に基づいた設定ファイルの分割です。デフォルトの application.yml は、すべての環境で共通して使用される基盤設定として機能します。例えば、アプリケーション名やシリアライズの設定など、環境に依存しない項目はここに集約すべきです。一方で、データベースの接続文字列(JDBC URL)、APIの接続先エンドポイント、認証情報、あるいはログの出力レベルといった「環境によって変化する要素」については、 application-dev.yml や application-prod.yml といった専用のファイルに切り出します。
この設計思想は、構成管理(Configuration Management)をシンプルにし、設定ミスによる事故を防ぐことにつながります。特に、本番環境のパスワードや秘匿情報を開発用ファイルに混入させないための、セキュリティ上の防波堤としても機能します。
実践的なサンプルコードで理解を深める
実際にプロファイルが正しく読み込まれているかを確認するための、より詳細なコンポーネントの例を考えてみましょう。以下の DatabaseConnectionChecker クラスは、現在読み込まれているデータソースのユーザー名を取得し、どの環境の設定が適用されているかを可視化するサンプルです。
import jakarta.inject.Singleton;
import io.micronaut.context.annotation.Value;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Singleton
public class DatabaseConnectionChecker {
private static final Logger LOG = LoggerFactory.getLogger(DatabaseConnectionChecker.class);
@Value("${datasources.default.username:unknown}")
private String dbUser;
@Value("${micronaut.application.name}")
private String appName;
@PostConstruct
public void init() {
LOG.info("アプリケーション名: {}", appName);
LOG.info("現在のデータベースユーザー: {}", dbUser);
if ("produser".equals(dbUser)) {
LOG.warn("警告: 現在、本番環境プロファイルで動作しています!");
} else {
LOG.info("開発用またはテスト用プロファイルが適用されています。");
}
}
public String getDbUser() {
return dbUser;
}
}
このコードでは、 @Value アノテーションを使用してプロファイルごとの設定値を注入しています。デフォルト値を指定する :unknown のような記述も、Micronautでは標準的に利用可能です。実行結果を確認すると、起動時の引数によって出力が変化することがわかります。
devプロファイルで起動した場合のログ出力
INFO i.m.context.DefaultBeanContext - アプリケーション名: demo-app
INFO i.m.context.DefaultBeanContext - 現在のデータベースユーザー: devuser
INFO i.m.context.DefaultBeanContext - 開発用またはテスト用プロファイルが適用されています。
prodプロファイルで起動した場合のログ出力
INFO i.m.context.DefaultBeanContext - アプリケーション名: demo-app
INFO i.m.context.DefaultBeanContext - 現在のデータベースユーザー: produser
WARN i.m.context.DefaultBeanContext - 警告: 現在、本番環境プロファイルで動作しています!
運用の現場で役立つヒント:環境変数の活用
DockerコンテナやKubernetesを用いてデプロイする場合、コマンドライン引数よりも環境変数でプロファイルを指定するほうが一般的です。 MICRONAUT_ENVIRONMENTS という環境変数を設定するだけで、Micronautは自動的にそれを検知します。これにより、同じDockerイメージを使い回しながら、デプロイ先のプラットフォーム(ステージング環境や本番環境)に応じて挙動を変える「Immutable Infrastructure」の原則を実現できます。
また、 application.yml の中で環境変数を参照することも可能です。例えば、 password: ${DB_PASSWORD:default_pass} のように記述しておけば、環境変数が存在すればその値を、なければデフォルト値を使用するという柔軟な設定が可能です。
生徒
「先生、ありがとうございました! application-dev.yml と application-prod.yml を使い分けるメリットがよく分かりました。ファイル名を変えるだけで自動的に読み込まれるのがスマートですね。」
先生
「その通り。設定のオーバーライド(上書き)という概念を理解すると、Micronautはもっと面白くなるよ。基本は application.yml で、差分だけを各プロファイルに書く。これが管理を楽にするコツだね。」
生徒
「もし、間違えて本番プロファイルで起動しちゃったら怖いですね……。何か防ぐ方法はありますか?」
先生
「いい質問だね。さっきのサンプルコードみたいに、起動時にログで現在の環境やユーザー名を表示させるのは実務でもよくやるよ。あとは、デプロイパイプラインで環境変数を厳密に管理することが大切だ。」
生徒
「なるほど!あと、複数のプロファイルを同時に使うこともあるって聞きましたけど、それはどんな時ですか?」
先生
「例えば『dev』プロファイルで基本的な開発設定を使いつつ、特定のクラウド機能だけ試したい時に『cloud』というプロファイルを足して dev,cloud と指定するようなケースだね。後から指定した方が強いから、 test プロファイルなどは最後に指定するのが一般的かな。」
生徒
「優先順位まで意識しないといけないんですね。最後に、設定ファイルの中で他の設定値を参照することもできるんでしょうか?」
先生
「もちろんできるよ。 ${micronaut.application.name} のように書けば、他の場所で定義した値を再利用できる。重複を減らしてメンテナンス性を高める工夫をしてみてね。」