MLOpsの推論APIは多数の同時接続を処理するため、Aurora PostgreSQLへ直で接続すると「コネクション過多 → クエリ遅延 → タイムアウト」となりがち。これを防ぐには 接続プール が必須です。

コネクション数の調整はこの記事を参照のこと


接続プールって何?(イメージ図)

[アプリ(APIサーバー)] --大量の接続--> [接続プール(PgBouncer / RDS Proxy)] --最適化された接続--> [Aurora DB]

例えるなら「人気レストランの受付係」。

  • お客さん(APIリクエスト)は一度に押し寄せる。
  • 受付係(接続プール)が順番に案内し、
  • 厨房(DB)に入る人数をコントロールする。

こうすることで厨房がパンクせず、スムーズに料理が出せるのです。


Pythonでの接続方法の違い

Pythonではソースコード側で「直接接続」か「プール経由」かを切り替えることが可能です。

直接接続例(psycopg2)

import psycopg2

conn = psycopg2.connect(
    host="your-aurora-endpoint",
    user="username",
    password="password",
    dbname="dbname"
)
cursor = conn.cursor()
cursor.execute("SELECT 1")
print(cursor.fetchone())

コネクションプール接続例(psycopg2.pool)

from psycopg2 import pool

connection_pool = pool.SimpleConnectionPool(
    1, 20,  # 最小1、最大20コネクションを管理
    host="your-aurora-endpoint",
    user="username",
    password="password",
    dbname="dbname"
)

# プールから接続を取得
conn = connection_pool.getconn()
cursor = conn.cursor()
cursor.execute("SELECT 1")
print(cursor.fetchone())

# 使用後は返却
connection_pool.putconn(conn)

※RDS ProxyやPgBouncerを利用する場合も、host を「Auroraのエンドポイント」から「Proxyのエンドポイント」に変えるだけでOKです。つまり、Auroraのエンドポイントを指定すれば直接接続、Proxyのエンドポイントを指定すればプール経由の接続になります。


利点(わかりやすく)

  • 🚀 スケーラビリティ向上
    → アクセス急増でも落ちにくい
  • 🔄 自動再接続で安心
    → AuroraのWriter切替でもAPIが止まりにくい
  • 速いレスポンス維持
    → 毎回コネクションを作る無駄を削減

設定例(RDS Proxy)

aws rds create-db-proxy \
  --db-proxy-name mlops-proxy \
  --engine-family POSTGRESQL \
  --auth "SecretsManagerArn=arn:aws:secretsmanager:...,AuthScheme=SECRETS" \
  --role-arn arn:aws:iam::123456789012:role/RDSProxyRole \
  --vpc-subnet-ids subnet-xxxx subnet-yyyy

運用のコツ

  • 📝 短命クエリ(推論結果の保存など)は必ずプール経由
  • 学習バッチ処理は直接接続も検討(プールを占有しない)
  • 🔧 プールサイズ調整:API同時接続数 × 平均クエリ時間で見積もる
  • 📈 実務でよくあるケース:アクセス急増に合わせてプールの上限値を増やす調整を行うことが多い。ただし増やしすぎるとDB側のCPUやメモリを圧迫するため、監視メトリクスを見ながら徐々に調整するのがベストプラクティス。

今日のまとめ Aurora PostgreSQLは強力だけど「接続数の上限」が隠れた落とし穴。
その対策として、RDS ProxyやPgBouncerでワンクッション置くのが安定稼働の秘訣です。

投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です