RDS ProxyのコネクションプールでToo many connectionsを対策する

  

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)

が、CloudWatchLogrds-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}"
Share:

0 Comments:

コメントを投稿