

RDS - MySQLインスタンスの同時接続数max_connections
パラメタは変更可能ではあるが規定値{DBInstanceClassMemory/12582880}
はインスタンスのメモリ容量に応じた接続数に最適化されていて、接続数の引き上げはインスタンスサイズのアップグレードが推奨されている。
これらの値を変更することはお勧めできません。もっと接続が必要な場合は、もっと大きい RDS インスタンスサイズにアップグレードすることをお勧めします。
故にマイクロなRDSインスタンスにがしがしパラレルで接続して検証するとあっという間に接続上限に到達してエラーになってしまう
Error 1040: Too many connections
コネクションプーリングでスケーリングしたいところだが、サーバーレス(lambda
)やランタイム(php
とかruby
)&フレームワークレベルでサクッと準備できない場合に
RDS Proxy
をRDSインスタンスの前段に入れるとサクッとプーリング機能を提供してくれる優れもので、マネージドのコネクションプーリング付きhaproxy的なイメージ。
使い方は簡単で、ALBのようにターゲットグループにRDSインスタンスを設定するだけ。
RDSインスタンスのID&PWクレデンシャルはRDS Proxy
の構築時にこれまたSecretManager
にフルマネージドで管理される。
Access Denied
-
RDS Proxy
の構築と同時にIAMロールrds-proxy-role-{タイムスタンプ}
が作成&アタッチ状態で、ロールにSecretManager
の当該クレデンシャルのARNを含むアクセスポリシーrds-proxy-policy-{タイムスタンプ}
が割当てられていて、クレデンシャルを参照している。 -
RDS Proxy
の構築後に自分でSecretManager
に追加したクレデンシャルはポリシーにARNを追加してやる必要がある。
ここがうまくいっていないと、アプリケーション側では延々とAccess deniedなエラーログが出るだけでなんで?と首をひねる事となる。
SQLSTATE[HY000] [1045] Access denied for user 'dbuser'@'XXX.XXX.XXX.XXX' (using password: YES)
が、CloudWatchLog
のrds-proxyのロググループ
にはばっちり権限エラーとして出力されていたので、追加したクレデンシャルのARNを追加して解決。
Credentials couldn't be retrieved. The IAM role "arn:aws:iam::XXXXXXXXXXXX:role/service-role/rds-proxy-role-XXXXXXXXXXXXX" is not authorized to read the AWS Secrets Manager secret with the ARN "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:{secret_name}.{secret_id}"