Amazon RDS Proxy の接続が固定される問題をトラブルシューティングする方法を教えてください。
Amazon Relational Database Service (Amazon RDS) Proxy を使用してターゲットデータベースにアクセスするときに接続が固定される問題をトラブルシューティングしたいと考えています。
解決策
CloudWatch メトリクスをレビューする
次の手順を実行します。
- Amazon CloudWatch コンソールを開きます。
- ナビゲーションペインで [メトリクス] を選択してから、[すべてのメトリクス] を選択します。
- [参照] タブで、[RDS] を選択してから、[プロキシごとのメトリクス] を選択します。
- DatabaseConnectionsCurrentlySessionPinned メトリクスを検索します。
DatabaseConnectionsCurrentlySessionPinned メトリクスは、RDS Proxy が 60 秒ごとに固定するデータベース接続の数を示します。クライアントリクエスト内の操作によってセッションの状態が変更されると、RDS Proxy は接続を固定します。
注: DatabaseConnectionsCurrentlySessionPinned メトリクスは、RDS Proxy が最初の固定された接続を検出したときに記録を開始し、固定された接続に NULL 値が含まれると記録を停止します。
RDS Proxy ログイベントを確認する
SQL ステートメントと RDS Proxy の内部操作に関する詳細情報を取得するには、プロキシを変更して拡張ログ記録を有効にします。
注: 拡張ログ記録は 24 時間後に自動的にオフになります。
接続が固定される問題をトラブルシューティングするには、RDS Proxy ログイベントを確認します。
次の手順を実行します。
- CloudWatch コンソールを開きます。
- ナビゲーションペインで [ログ] を選択し、次に [ロググループ] を選択します。
- /aws/rds/proxy/プロキシ名など、プロキシのロググループを選択します。
- [ログストリーム] タブで、ログイベントを表示するログストリームを選択します。
CloudWatch Logs Insights のクエリを実行して異常を検出する
CloudWatch Logs Insights のクエリエディタにアクセスするには、次の手順を実行します。
- CloudWatch コンソールを開きます。
- ナビゲーションペインで [ログ] を選択した後に [Log Insights] を選択します。
クエリエディタを使用して、次のクエリを実行します。各クエリで、proxy-name をプロキシ名に置き換えてください。
個々の接続が固定された理由を調べるには、次のクエリを実行します。
fields @message | sort @timestamp asc | filter @logStream like '{proxy-name}' | filter @message like /The client session was pinned to the database connection/
固定された接続が多いものをカウント順に取得するには、次のクエリを実行します。
fields @message | sort @timestamp asc | filter @logStream like '{proxy-name}' | filter @message like /The client session was pinned to the database connection/ | parse 'Reason: \\\*' as reason | stats count() as reasonCount by reason | sort by reasonCount desc | limit 20
セッション設定の変更を解決する
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
クライアント接続がセッションレベルの変数設定を変更すると、RDS Proxy は接続を再利用できないため、接続を固定します。
その場合、次のエラーメッセージが表示されます。
"The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session.The proxy can't reuse this connection until the session ends.Reason: SQL changed session settings that the proxy doesn't track.Consider moving session configuration to the proxy's initialization query."
すべてのデータベース接続は同一の設定でなければなりません。この問題を解決するには、プロキシを作成するときに初期化クエリ設定を追加します。プロキシが新しいデータベース接続を開くたびに実行する SQL ステートメントを指定します。既存のプロキシを変更するには、Amazon RDS コンソールを使用するか、modify-db-proxy-target-group AWS CLI コマンドを実行します。
重要: パスワードや長期間有効な暗号化キーなどの機密データを初期化クエリに追加しないでください。プロキシターゲットグループの設定にアクセスできるユーザーなら誰でも初期化クエリを表示できるため、認証や暗号化方式によって保護されることはありません。
通常、初期化クエリ設定を SET ステートメントで使用して、各接続の設定が同じになるようにします。1 つの SET ステートメントに複数の変数を含めるには、コンマ区切りを使用します。
例えば、次のコマンドを実行して、初期化クエリにタイムゾーン変数を設定できます。
aws rds modify-db-proxy-target-group --target-group-name default --db-proxy-name proxy --connection-pool-config '{ > "InitQuery": "SET time_zone = \"+00:00\";" > }'
注: proxy を実際のプロキシ名に置き換えてください。
解析メッセージとプロトコルレベルのプリペアドステートメントのエラーを解決する
asyncpg/mysql.connector などの特定のライブラリが、内部でプロトコルレベルのプリペアドステートメントを使用する場合、次のいずれかのエラーメッセージが表示されます。
- "The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session.The proxy can't reuse this connection until the session ends.Reason: A parse message was detected."
- "The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session.The proxy can't reuse this connection until the session ends.Reason: A protocol-level prepared statement was detected."
クライアントがプリペアドステートメントを使用する場合、RDS Proxy は接続を固定します。
この問題を解決するには、プロキシが明示的に接続を使用した後に、プリペアドステートメントを使用するすべての接続を閉じます。
大規模な SQL クエリを解決する
次のエラーメッセージが表示される場合があります。
"The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session.The proxy can't reuse this connection until the session ends.Reason: The connection ran a SQL query which exceeded the 16384 byte limit."
RDS Proxy がサポートするすべての DB エンジンで、RDS Proxy は 16 KB を超える SQL ステートメントを検出するとセッションを固定します。SQL ステートメントのサイズを小さくするのがベストプラクティスです。例えば、コメントを削除したり、エイリアスの使用を制限したりします。
接続の固定を削減する
プロキシが接続を固定する原因となる不要なデータベースリクエストを避けるには、次の操作を実行してください。
- 接続の固定を開始するデータベース操作を削除する。
- バッチ操作を使用して、関連するリクエストを 1 つのクエリにまとめる。
接続設定を標準化するには、次の操作を行います。
- トランザクションレベルの再利用を管理するために、接続間で一貫した変数と設定の構成を維持する。
- Amazon RDS for PostgreSQL の場合は、データベース側で変数を設定します。クライアント側で変数を設定すると、RDS Proxy はデータベース接続を固定します。
- Amazon RDS for MySQL データベースの場合は、セッション固定フィルタを使用して、セッション固定の要件を安全に回避できるデータベース操作を指定する。
共通の SET ステートメントをプロキシの初期化クエリに移動して、すべての接続で同じ初期化を行い、トランザクションレベルの再利用を維持するのがベストプラクティスです。
関連情報
- 言語
- 日本語
