エラーメッセージ
[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"
そこで、もう少し調べたところ、以下が出てきた。
RDSに接続しているユーザが EXECUTE 権限を持ってないから。
ほう。
今回のサイト刷新でユーザを新設していた。
と思い、RDS接続ユーザをEXECUTE 権限を持っているユーザに変えたら、
500エラーではなく、サイトが正常表示されるようになった。
EXECUTE GDR ユーザがストアドルーチンを起動させるのを可能にします。
ユーザーに設定できる権限の種類と一覧 | MySQLの使い方
ストアドルーチンとは、サーバ上に名前を付けて格納しておけるひと塊のSQLのことです。ストアドプロシージャとストアドファンクション(ユーザ定義関数)の2種類からなり、毎回長いクエリを発行しなくても、いつでも呼び出して使えます。
初心者からのMySQLストアドプロシージャ&ファンクション入門 | サービス | プロエンジニア
“ストアドルーチン”とは、「ストアドプロシージャ」と「ストアドファンクション」の2種類で構成されるSQLのことです。
データベース内に名前を付けて格納しておけるのが特徴であり、これを発行しておくことで手軽に呼び出せます。
https://style.potepan.com/articles/18757.html
RDSのパラメータグループの設定内容は、ストアドルーチンとして保存してるってことだろうな。
RDSへの接続ユーザに、EXECUTE 権限を付けることで解決しました。