EC2からRDSの接続で、init_connect command failedが発生する

エラーメッセージ

[previous exception] [object] (PDOException(code: 08S01): SQLSTATE[08S01]: Communication link failure: 1184 Aborted connection 12 to db: 'DBNAME' user:
'USER_NAME' host: '10.0.0.1' (init_connect command failed) at ・・・

 

調べると、文字コードやtimezoneが原因という記事が多い。

MySQL - MySQLに接続したいのですが、ERROR 1184 (08S01): Aborted connectionが出てしまう。|teratail

MySQLでMySQL server has gone awayエラー - 奈良橿原 プログラミング・アカデミー 技術ノート

初心者の覚え書き XAMPPのMySQLの設定をUTF-8にしようとしてハマったときのメモ

 

 

 

 

ほう。

と思い、テスト環境のRDSと、本番環境のRDSを見比べたところ、

timzone設定用に作成して本番環境に対して設定していたパラメータグループが、

テスト環境には設定されていなかった。

 

そこで、テスト環境にも同じパラメータグループを設定して、RDSを停止・起動したところ、テスト環境でも再現した。

 

 

 

 

テスト環境のRDSのタイムゾーンが以下にように変わった。

 

パラメータグループ設定前

mysql> select @@system_time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@system_time_zone | @@session.time_zone |
+--------------------+---------------------+
| UTC | UTC |
+--------------------+---------------------+
1 row in set (0.00 sec)

 

設定後

mysql> select @@system_time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@system_time_zone | @@session.time_zone |
+--------------------+---------------------+
| UTC | Asia/Tokyo |
+--------------------+---------------------+
1 row in set (0.00 sec)

 

 

 

 

同じRDSに接続をして、

本番環境のEC2からは正常表示されるが、テスト環境のEC2からは500エラーとなる。

テスト環境のEC2の設定の問題かと思い、php.iniとhttpd.confを確認した。

 

EC2のここが怪しいのかな。

< date.timezone = Asia/Tokyo
---
> ;date.timezone =

 

と思い、本番環境のphp.iniを調べたが、同じように、Asia/Tokyoを設定していた。

date.timezone = "Asia/Tokyo"

 

 

 

そこで、もう少し調べたところ、以下が出てきた。

mariadb - Connection to Amazon RDS MySQL instance fails with `init_connect command failed` - Database Administrators Stack Exchange

RDSに接続しているユーザが EXECUTE 権限を持ってないから。

 

ほう。

今回のサイト刷新でユーザを新設していた。

 

と思い、RDS接続ユーザをEXECUTE 権限を持っているユーザに変えたら、

500エラーではなく、サイトが正常表示されるようになった。

 

 

EXECUTE GDR ユーザがストアドルーチンを起動させるのを可能にします。

ユーザーに設定できる権限の種類と一覧 | MySQLの使い方

 

ストアドルーチンとは、サーバ上に名前を付けて格納しておけるひと塊のSQLのことです。ストアドプロシージャとストアドファンクション(ユーザ定義関数)の2種類からなり、毎回長いクエリを発行しなくても、いつでも呼び出して使えます。

初心者からのMySQLストアドプロシージャ&ファンクション入門 | サービス | プロエンジニア

 

“ストアドルーチン”とは、「ストアドプロシージャ」と「ストアドファンクション」の2種類で構成されるSQLのことです。

データベース内に名前を付けて格納しておけるのが特徴であり、これを発行しておくことで手軽に呼び出せます。

https://style.potepan.com/articles/18757.html

 

 

RDSのパラメータグループの設定内容は、ストアドルーチンとして保存してるってことだろうな。

 

 

RDSへの接続ユーザに、EXECUTE 権限を付けることで解決しました。