1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS初学者】備忘録:Spring BootでMySQLに接続できない原因が build/resourcesにあったお話

Posted at

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

再発防止として学んだこと

  1. Spring Boot実行時にどの設定ファイルが参照されているかを意識する
  2. Gradle を使っている場合、設定変更後はcleanを実行する
   ./gradlew clean
   ./gradlew bootRun

3.「CLIでは接続できるが、アプリではできない」場合はアプリ側の設定を疑う

  • インフラ・ネットワーク・MySQL側が正常 → 設定ファイルの問題
  1. 環境変数による上書きも確認する
   env | grep SPRING_DATASOURCE

トラブルシューティングの流れ

  1. インフラ層の確認

    • セキュリティグループ
    • ネットワーク接続
    • MySQLの起動状態
  2. MySQL層の確認

   mysql -u root -p -h <エンドポイント>
   SELECT user, host FROM mysql.user;
   SELECT user, host, plugin FROM mysql.user WHERE user='root';
   SHOW DATABASES;
  1. アプリケーション層の確認
   env | grep SPRING_DATASOURCE
   grep -R "spring.datasource" build/resources
   ps aux | grep java
  1. 設定の反映
   vi src/main/resources/application.properties
   ./gradlew clean
   ./gradlew bootRun

まとめ

MySQLの接続エラーでは、実行時に使われている設定ファイルの場所が原因になることもあることを知った。
特にGradleを使用している場合は、src/main/resourcesを修正しても./gradlew cleanを実行しなければ変更が反映されないことを覚えておく。


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?