1. はじめに
SpringBoot等のモダンなアプリケーションではポート番号を環境変数で容易に変更することが可能です。それに倣い、Tomcatで動作しているJavaアプリをコンテナ化するというレガシーシステムのクラウドリフト案件で起こりえるケースを前提とし、Tomcatのポート番号を外部(環境変数)から変更可能とする方法について説明したいと思います。
2. 検証環境・バージョン
- OS : Windows 11 Pro 23H2
- Java : Corretto-17.0.12.7.1
- Apache Tomcat : 10.1.26
3. 設定方法
<!-- ⭐️ ポイント1 -->
<Connector port="${server.port}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
⭐️ ポイント1
設定ファイル(server.xml)の設定値として環境変数を参照したい箇所を${キー}
形式で定義します。
今回のサンプルではhttpコネクタのport属性のみですが、他のコネクタ(ajpコネクタ)や他の属性(redirectPortt等)も同様に設定可能です。
@echo off
rem ⭐️ ポイント2
set JAVA_OPTS=-Dserver.port=%SERVER_PORT%
⭐️ ポイント2
デフォルトではsetenv.bat
ファイルは存在しないので新規に作成します。※ Linuxの場合はsetenv.sh
設定ファイル(server.xml)で参照している${キー}
形式の値をJAVA_OPTSにシステムプロパティとして定義します。
つまり環境変数ではなくシステムプロパティを参照しているが正しい説明になります。
システムプロパティの定義時に環境変数を参照することで、推移的に環境変数で定義できるようにしています。
4. 動作確認
環境変数SERVER_PORT
にポート番号:8083を定義してTomcatを起動してみます。
5. さいごに
JAVA_OPTS
とシステムプロパティを利用し、Tomcatのポート番号を環境変数で定義する方法について説明しました。
Twelve-Factor App を踏まえるとアプリ単位でTomcatコンテナを立ち上げる場合、ポート番号を環境変数で変更・定義できることは重要です。
コンテナをどのような環境で動かすのかはコンテナ利用者の裁量であり、コンテナ提供者が決めるべきものではないからです。
パブリッククラウドにおけるコンテナの実行、例えばAWSのECSでは環境変数を連携(パラメータストア等)できるように最初からデザインされています。
クラウドリフトするのではあれば、できるかぎりクラウドに適した構成を心掛けましょう。