AWS上でWordPressを構築している時に誰しもが必ず見たことがあるエラーがあります。
それが
Error establishing a database connection
または
データベース接続確立エラー
です。
経験則的にはEC2インスタンスのスペックが低くて負荷が高まっているなど何かしらEC2インスタンスに問題が発生している場合はインスタンス再起動で解決することが多いのですが、インスタンスの負荷状況に全く問題がなさそうで、再起動しても解決しない、DB接続のパラメータ等も変えていない、/var/log/message等のログにも何も出ていない八方塞がりな時があってハマりました。
解決の糸口になったのは試しにサーバ上からmysqlの接続を試みてみました。
mysql -u username -pPassword -h hostname
するとこんなエラーが発生しました。
RDS is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
これ、調べてみるとRDSのパラメータグループにmax_connect_errorsというパラメータがあるのですが、この値以上に接続失敗するとブロックされるという仕組みになっているようでした。デフォルト値が10だか100だかでそれ以上になると上記エラーが出るようです。
一旦の回避方法としてはここの値を高く設定(上限9223372036854775807)すれば接続はできるようになりました。根本的にはなぜ接続失敗が続いたのかということを考えないとそのうち設定し直した値を超えて再発しそうではあります。
一応、ログインして
FLUSH HOSTS;
すれば回数をクリアできる、と書いてるところもあったのですが、実際やってみると
Access denied; you need (at least one of) the RELOAD privilege(s) for this operation
権限がなさそうで、ルート権限でのアクセスが必要で、RDSでルート権限ってどうやるんだ?というところで、まだ調べてない感じです。
以上、エラーの一旦の回避方法でした。