Spring BootでMySQLに接続できない原因が build/resourcesにあった件
この記事は、AWS学習中につまづいた際の備忘録になります。
発生した事象
Spring Bootアプリケーションを起動し、ブラウザからアクセスすると以下のようなエラーが発生
java.sql.SQLException: Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)
一方で、ターミナルからは以下のようにMySQLに正常に接続できる状態
mysql -u root -p -h <RDSエンドポイント>
このため、「MySQL自体は動いているが、Spring Bootからの接続だけが失敗している」という状況
環境
- Java 21
- Spring Boot
- Gradle
- MySQL
- AWS RDS (EC2から接続)
最初に疑ったこと
以下を確認
- セキュリティグループの設定
- MySQLユーザーの権限
- DB名の指定ミス
- 認証方式(plugin)の違い
- 環境変数による上書き
しかし、以下が確認できたため、インフラやDB側の問題ではないと判断
- MySQLにはCLIで接続できる
-SELECT user, host FROM mysql.user;でroot | %が存在 - 認証方式も
mysql_native_passwordで正常 - 環境変数
env | grep SPRING_DATASOURCEは何も出ない
原因調査:Spring Bootが参照している設定ファイル
Spring Bootの設定は通常src/main/resources/application.propertiesに書く
src/main/resources/application.properties
しかし、Gradleを使って起動している場合、実行時に参照されるのは次の場所
build/resources/main/application.properties
このファイルを確認したところ、古いデータベースパスワードが残っていた
grep -R "spring.datasource" build/resources
結果:
build/resources/main/application.properties:spring.datasource.password=xxxxxxx
src/main/resources側を修正してもbuild/resources側が更新されていなかったため、修正が反映されなかった
原因
- Gradle 実行時、
src/main/resourcesの内容はbuild/resourcesにコピーされる -
./gradlew cleanを実行していなかったため、古い設定ファイルが使われ続けていた - Spring Bootは実行時に
build/resources/main/application.propertiesを読み込む
解決方法
以下の手順で解決
1. 設定ファイルを修正
vi src/main/resources/application.properties
spring.datasource.password=正しいパスワード
2. cleanを実行してから起動
./gradlew clean
./gradlew bootRun
build/resourcesが再生成され、Spring Bootが正しい設定を参照するようになった
確認方法
修正が反映されているか確認する
grep spring.datasource build/resources/main/application.properties
再発防止として学んだこと
- Spring Boot実行時にどの設定ファイルが参照されているかを意識する
- Gradle を使っている場合、設定変更後はcleanを実行する
./gradlew clean
./gradlew bootRun
3.「CLIでは接続できるが、アプリではできない」場合はアプリ側の設定を疑う
- インフラ・ネットワーク・MySQL側が正常 → 設定ファイルの問題
- 環境変数による上書きも確認する
env | grep SPRING_DATASOURCE
トラブルシューティングの流れ
-
インフラ層の確認
- セキュリティグループ
- ネットワーク接続
- MySQLの起動状態
-
MySQL層の確認
mysql -u root -p -h <エンドポイント>
SELECT user, host FROM mysql.user;
SELECT user, host, plugin FROM mysql.user WHERE user='root';
SHOW DATABASES;
- アプリケーション層の確認
env | grep SPRING_DATASOURCE
grep -R "spring.datasource" build/resources
ps aux | grep java
- 設定の反映
vi src/main/resources/application.properties
./gradlew clean
./gradlew bootRun
まとめ
MySQLの接続エラーでは、実行時に使われている設定ファイルの場所が原因になることもあることを知った。
特にGradleを使用している場合は、src/main/resourcesを修正しても./gradlew cleanを実行しなければ変更が反映されないことを覚えておく。