Play Frameworkでの設定ファイルの外部化!環境変数・Docker・Kubernetes対応
生徒
「Play Frameworkでアプリを作ったんですけど、開発環境と本番環境で設定を変えたいです。」
先生
「それなら、configの外部化を使うと便利です。環境変数やDocker、Kubernetesでも同じ設定を使えます。」
生徒
「configの外部化ってどうやってやるんですか?」
先生
「順を追って説明しますね。Play FrameworkはHOCON形式のapplication.confを使いますが、外部化することで環境ごとに設定を切り替えられます。」
1. configの外部化とは?
Play Frameworkのconf/application.confにはデータベース接続やポート番号、APIキーなどを設定します。しかし、開発環境や本番環境で同じファイルを使うと設定が混ざってしまいます。そこで、外部化を行うことで、環境ごとに設定を変更できるようにします。
外部化には主に以下の方法があります。
- 環境変数を利用する
- Dockerコンテナに設定を渡す
- Kubernetes ConfigMapやSecretを利用する
2. 環境変数を使った設定外部化
Play Frameworkでは${VAR_NAME}形式で環境変数を参照できます。例えば、データベースのURLを環境変数にすると、ローカル開発と本番環境で異なる値を簡単に切り替えられます。
# conf/application.conf
db.default.url = ${DB_URL}
db.default.username = ${DB_USER}
db.default.password = ${DB_PASSWORD}
この場合、実行前に環境変数を設定しておきます。
export DB_URL="jdbc:postgresql://localhost:5432/mydb"
export DB_USER="user"
export DB_PASSWORD="pass"
sbt run
これで開発環境ごとに設定を変更できます。
3. Docker環境での設定外部化
DockerでPlay Frameworkを実行する場合、環境変数や.confファイルをコンテナに渡すことで設定を外部化できます。
docker run -e DB_URL="jdbc:postgresql://db:5432/prod" \
-e DB_USER="produser" \
-e DB_PASSWORD="prodpass" \
my-play-app
また、Docker Composeを使うと複数サービスの設定を一元管理できます。
4. Kubernetes(K8s)対応
KubernetesではConfigMapやSecretを使って設定を外部化します。ConfigMapは一般的な設定用、SecretはパスワードやAPIキーのような機密情報用です。
apiVersion: v1
kind: ConfigMap
metadata:
name: play-config
data:
DB_URL: "jdbc:postgresql://db:5432/prod"
DB_USER: "produser"
---
apiVersion: v1
kind: Secret
metadata:
name: play-secret
type: Opaque
data:
DB_PASSWORD: cHJvZHBhc3M= # base64でエンコード
Pod定義で環境変数として注入すれば、Play Frameworkは同じapplication.confを使いながら環境ごとに設定を切り替えられます。
5. 外部化のメリット
- 開発環境・本番環境で設定を簡単に切り替えられる
- DockerやKubernetesでも同じ設定ファイルで動作する
- セキュリティ上、パスワードやAPIキーをコードに書かずに管理できる
- CI/CD環境でも柔軟に設定を切り替え可能
Play Frameworkでのconfig外部化は、現代のクラウドネイティブ開発において非常に重要な技術です。初めは少し難しく感じますが、環境変数、Docker、Kubernetesを順に学ぶことでスムーズに運用できます。