今回は、『PHP アプリで RDS for MySQL 9.x に備える』という話題を取り扱います。最近検証する機会があったので、他の方が同じような状況になった際に助けになるよう、概要を共有できればと思います。Aurora MySQL でも概ね同じですので、その際も参考になると思います。
RDS for MySQL 8.4 はあと3年程度で標準サポート終了
RDS for MySQL 8.4 は、2029 年 7 月 31 日(参考元)に標準サポートが終了します。MySQL 8.4 からデフォルトの認証プラグインが caching_sha2_password になり、 9.x から mysql_native_password は廃止されます。これにより、古い PHP では DB 接続自体ができなくなります。MySQL 8.4 時点では認証プラグインを mysql_native_password に指定すればごまかせますが、9.0 では無理です。
PHP で caching_sha2_password に対応する方法(MySQL Community Edition の場合)
MySQL Community Edition の場合、以下の選択肢があります。
- PHP 7.4.4 以降の PDO を利用する
- 既に PDO を利用しているなら、これが1番簡単
- Laravel の場合、 PDO 前提になっているので原則こちら
- X プラグインを使う
- PHP 7.2.x 以降で利用可能
- ただし、MySQL ドライバーを切り替える作業は必要
しかし、RDS for MySQL では話が変わります。
RDS の MySQL(RDS for MySQL, Aurora MySQL)には MySQL Community Edition とは違う独自仕様がある
- RDS for MySQL は、一部拡張が使用できない(参考元)
- Aurora MySQL も同じ
- X プラグインを利用できない
- PDO を使うしかない
結論
- RDS for MySQL の場合、PDO しか選択肢がないので、PHP は 7.4.4 以降にする必要がある
- どうしても PHP バージョンを更新できない場合、EC2 インスタンス内に自分で古いバージョンの MySQL サーバーを立て、DB をそちらに移行する形になる
- PHP はなるべく常に最新バージョンにしておくのが吉
- 人的リソースやサービス性質の問題で無理な場合もあるので、ここは状況次第
AWS 公式ドキュメントにある通り、RDS for MySQL(Aurora MySQLも同様)では X プラグインが使用できません。これを知らずに『最悪 X プラグイン使えばいいから、PHP バージョンは古いままでいいか』と思っていると大変なことになります。