ブログ
MySQL5→8.4(RDS)移行で接続できない原因は認証方式だった話
はじめに
MySQL 5系からMySQL 8.4(RDS)への移行時に、アプリケーションからデータベースへ接続できない問題に遭遇しました。
ユーザーの認証方式を変更しても解決せず、最終的にはRDS側の設定が原因だったため、実際に発生した事象と対処内容をこちらにまとめます。
利用環境
- MySQL 5系 → MySQL8.4 (Amazon RDS)
- baserCMS 4.1.6
エラーメッセージ
以下のようなエラーが発生していました。
A Database connection using "BcMysql" was missing or unable to connect.
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
※「BcMysql」とは、baserCMSでMySQLに接続するためのデータベースドライバーです。
このエラーは、サーバー側の認証方式にクライアントが対応していない場合に発生します。
MySQL8からデフォルトの認証方式が 「caching_sha2_password」に変更されたことにより、このような不一致が発生することがあります。
参考:MySQL8.4での認証方式(caching_sha2_password)の詳細(公式ドキュメント)
最初に試したこと(ただし解決せず)
まずは、ユーザーの認証方式を「mysql_native_password」へ変更。
また、MySQL8系移行時の互換性も考慮し、以下の設定もRDSのパラメータグループにて実施しました。
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
しかし、これらでは解決しませんでした。
根本原因
原因は、RDSのパラメータグループで設定されている認証ポリシーでした。
当初はユーザーの認証方式を変更することで解決すると考えていましたが、改善せず。
エラーメッセージ(SQLSTATE[HY000] [2054] )から引き続き認証方式に問題があると判断し、「サーバー側にも関連する設定があるかもしれない」と考え、RDSのパラメータグループを確認しました。
その中で認証ポリシーに関する設定(authentication_policy)を見つけ、変更を試したところ、接続が改善しました。
そのため今回は、RDS側の認証ポリシーとクライアント側の認証方式に不一致があったことが原因で、認証エラーが発生していたことがわかりました。
対応方法
RDSのパラメータグループで以下を設定することで解決しました。
authentication_policy = *:mysql_native_password
この設定により、従来の認証方式が使用されるようになり、正常に接続できるようになりました。
まとめ
今回のように、MySQL8系(特にRDS)への移行では認証方式の不一致にハマる可能性があります。
ユーザー設定だけで解決しない場合は、サーバー側の設定も含めて確認することが重要です。
特にRDSではパラメータグループによって挙動が制御されるため、DB接続に問題が発生した際は、認証ポリシーを含めて一度確認してみると解決の手がかりになる可能性があります。
今回の対応を通して、クライアントとサーバー双方の視点で考えることの大切さを実感しました。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!