あるチームがLambda関数でデータベース接続を管理している。Lambda関数は毎秒100回呼ばれており、関数内でハンドラー関数の中に接続確立のコードを書いているため、毎回接続と切断が発生しRDSの接続数が枯渇している。コード変更を最小限にしてこの問題を最も効果的に解決する方法はどれか。
- A. RDS Proxyを使用してコネクションプーリングをプロキシレイヤーで管理する
- B. RDSのmax_connectionsパラメータを増やして接続数の上限を引き上げる
- C. Lambda関数のタイムアウトを延ばして接続が確立する時間を確保する
- D. データベース接続をハンドラー関数の外(モジュールレベル)に移動して、Lambda実行環境の再利用によって接続を使いまわす
解答と解説を見る
正解: A
この問題には2つの有効な解決策がある。選択肢Dのモジュールレベルへの移動はLambdaの実行環境再利用による接続の使いまわしだが、Lambda実行環境の再利用は保証されず、コールドスタート時には毎回接続が発生し、かつ各Lambda実行環境が個別の接続を持つため毎秒100回呼ばれる環境では依然として大量の接続が存在する。最も効果的かつコード変更が最小限なのは選択肢AのRDS Proxyで、Lambda関数のデータベース接続先をRDS Proxyのエンドポイントに変更するだけで、Proxy側でコネクションプーリングを管理し実際のRDSへの接続数を大幅削減できる。100並列のLambdaが来てもRDS Proxyが少数の接続に集約してRDSに渡す。選択肢Bの上限引き上げは根本解決にならずRDSのメモリ消費が増大する。選択肢Cのタイムアウト延長は問題と無関係。RDS ProxyはLambdaからのRDS接続に特に有効なソリューションとしてAWSが推奨。
📚 関連サービスの解説: Amazon RDS