概要
AWS LambdaからRDSにアクセスするたびにDB接続が確立すると、接続数の急増によりリソースが逼迫することがあります。RDS Proxyを使うとコネクションプールを利用できるので負荷を軽減できます。
と言うことで、RDS Proxyを導入してみたのですが、以下のエラーに遭遇。
error: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
こちらの解決方法を紹介します。
解決方法
原因は、セキュリティグループにありました。
以下の記事を参考にしたら解決。
RDSとRDS Proxyを同じSecurity Groupに紐付けると疎通エラーとなるので、個別に分けた方が良いかと思います。
https://blog.serverworks.co.jp/2022/01/20/093110
私は最初、以下のように設定していました。
・Lambda用のセキュリティグループx1
・RDS/RDS Proxy用のセキュリティグループx1
これを、上記記事にあるように、3つそれぞれ作成したら疎通できるようになりました。
・Lambda用のセキュリティグループx1
・RDS Proxy用のセキュリティグループx1
・RDS用のセキュリティグループx1
どうやら、RDSとRDS Proxyどちらにも接続できてしまうとルールの競合?的なものが起きて、エラーが発生するようです。
以下のstackoverflowにも記載がありました。
The best thing you can probably do is to create a separate security group for the RDS Proxy.
It is not possible, right now through AWS web console, to create a self reference.
https://stackoverflow.com/questions/65634272/connection-error-when-using-aws-rds-proxy
stackoverflowの回答では、'self referential' security group rule
を追加することでも対応できるそうですが、こちらの方は試していません。
また、RDS Proxyを使うと連続した負荷テストでは効果を発揮しますが、単発の処理性能が劣化するようです。これはコネクションプーリングの初期化で時間が要するため、その分長くなってしまっているのではないか?と思われます。以下の記事でも同じような現象がありました。詳細を把握できましたら別途更新します。