RDS Proxy の管理 - Amazon Relational Database Service

RDS Proxy の管理

次に、RDS Proxy の操作と設定を管理する方法について説明します。以下の手順は、アプリケーションがデータベース接続を最も効率的に使用し、接続を最大限に再利用するのに役立ちます。接続の再利用率を高めるほど、CPU とメモリのオーバーヘッドを減らすことができます。これにより、アプリケーションのレイテンシーを減らし、データベースのより多くのリソースをアプリケーションからのリクエストの処理に集中させることができます。

RDS Proxy の変更

プロキシの作成後に、プロキシに関連付けられた特定の設定を変更できます。これを行うには、プロキシ自体、プロキシに関連付けられているターゲットグループ、またはその両方を変更します。各プロキシには、ターゲットグループが関連付けられています。

プロキシの設定を変更するには

  1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、[プロキシ] を選択します。

  3. プロキシのリストで、設定を変更するプロキシを選択するか、その詳細ページに移動します。

  4. [アクション]、[変更] の順に選択します。

  5. 変更するプロパティを入力または選択します。次を変更できます。

    • プロキシ識別子 - プロキシの名前を変更するには、新しい識別子を入力します。

    • Transport Layer Security が必要 - Transport Layer Security (TLS) の要件を有効または無効にします。

    • アイドル状態のクライアント接続のタイムアウト - アイドル状態のクライアント接続のタイムアウトの時間を入力します。

    • Secrets Manager シークレット - Secrets Manager シークレットを追加または削除します。これらのシークレットは、データベースのユーザー名とパスワードに対応します。

    • IAM ロール - Secrets Manager からシークレットを取得するために使用する IAM ロールを変更します。

    • IAM 認証 - プロキシへの接続に IAM 認証をすることを要求または禁止します。

    • VPC セキュリティグループ - プロキシで使用する VPC セキュリティグループを追加または削除します。

    • 拡張されたログ記録を有効にする - 拡張ログ記録を有効または無効にします。

  6. [Modify] を選択します。

変更する設定がリストにない場合は、以下の手順を使用して、プロキシのターゲットグループを更新します。プロキシに関連付けられているターゲットグループは、物理データベース接続に関連する設定を制御します。プロキシごとに default という名前の 1 つのターゲットグループが関連付けられています。このターゲットグループはプロキシと共に自動的に作成されます。

ターゲットグループは、プロキシの詳細ページからのみ変更できます。[プロキシ] ページのリストから変更することはできません。

プロキシのターゲットグループの設定を変更するには

  1. [プロキシ] ページから、プロキシの詳細ページに移動します。

  2. [ターゲットグループ] で、default リンクを選択します。現在、すべてのプロキシには default という名前のターゲットグループが 1 つ あります。

  3. [デフォルト] ターゲットグループの詳細ページで、[変更] を選択します。

  4. 変更できるプロパティに対して新しい設定を選択します。

    • データベース - 別の RDS DB インスタンスまたは Aurora クラスターを選択します。

    • 接続プールの最大接続数 - プロキシで使用できる最大接続数の割合 (%) を調整できます。

    • セッション固定フィルター - (オプション)セッション固定フィルタを選択します。これにより、トランザクションレベルでの不十分な接続の再利用に起因するパフォーマンス問題を軽減できます。この設定を使用するには、RDS Proxy でセッションをデータベース接続にピン留めする場合のアプリケーションの動作と状況を理解する必要があります。

    • 接続借用タイムアウト - 接続借用タイムアウト間隔を調整します。この設定は、プロキシで最大数の接続がすでに使用されている場合に適用されます。この設定により、プロキシがタイムアウトエラーを返す前に、接続が使用可能になるまで待つ時間が決まります。

    • 初期化クエリ - (オプション) 初期化クエリを追加するか、現在のクエリを変更します。新しい各データベース接続を開くときに実行するプロキシ用の 1 つ以上の SQL ステートメントを指定できます。設定は通常、各接続のタイムゾーンや文字セットなどの設定が同一であることを確認するために、SET ステートメントとともに使用されます。複数のステートメントの場合は、セミコロンをセパレータとして使用します。たとえば、1 つの SET ステートメントに SET x=1, y=2 など複数の変数を含めることもできます。PostgreSQL の場合、初期化クエリは現在サポートされていません。

    ターゲットグループ識別子やデータベースエンジンなどの特定のプロパティは変更できません。

  5. [Modify target group (ターゲットグループの変更)] を選択します。

AWS CLI を使用してプロキシを変更するには、modify-db-proxymodify-db-proxy-target-groupderegister-db-proxy-targetsregister-db-proxy-targets の各コマンドを使用します。

modify-db-proxy コマンドを使用すると、次のようなプロパティを変更できます。

  • プロキシで使用する一連の Secrets Manager シークレット。

  • TLS が必要かどうか。

  • アイドルクライアントのタイムアウト。

  • デバッグ用に SQL ステートメントからの追加情報をログに記録するかどうか。

  • Secrets Manager シークレットの取得に使用する IAM ロール。

  • プロキシで使用するセキュリティグループ。

次の例は、既存のプロキシの名前を変更する方法を示しています。

aws rds modify-db-proxy --db-proxy-name the-proxy --new-db-proxy-name the_new_name

接続関連の設定を変更したり、ターゲットグループの名前を変更したりするには、modify-db-proxy-target-group コマンドを使用します。現在、すべてのプロキシには default という名前のターゲットグループが 1 つ あります。このターゲットグループを使用する場合、プロキシの名前とターゲットグループ名 (default) を指定します。

次の例は、最初にプロキシの MaxIdleConnectionsPercent 設定をチェックし、次にターゲットグループを使用して設定を変更する方法を示しています。

aws rds describe-db-proxy-target-groups --db-proxy-name the-proxy { "TargetGroups": [ { "Status": "available", "UpdatedDate": "2019-11-30T16:49:30.342Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 50, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } ] } aws rds modify-db-proxy-target-group --db-proxy-name the-proxy --target-group-name default --connection-pool-config ' { "MaxIdleConnectionsPercent": 75 }' { "DBProxyTargetGroup": { "Status": "available", "UpdatedDate": "2019-12-02T04:09:50.420Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 75, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } }

deregister-db-proxy-targets コマンドと register-db-proxy-targets コマンドでは、ターゲットグループを通じてプロキシが関連付けられている RDS DB インスタンスまたは Aurora DB クラスターを変更します。現在、各プロキシが接続できる RDS DB インスタンスまたは Aurora DB クラスターは 1 つです。ターゲットグループは、マルチ AZ 設定のすべての RDS DB インスタンス、または Aurora クラスター内のすべての DB インスタンスの接続の詳細を追跡します。

次の例では、cluster-56-2020-02-25-1399 という名前の Aurora MySQL クラスターに関連付けられているプロキシを最初に使用します。次に、このプロキシを変更して provisioned-cluster という名前の別のクラスターに接続できるようにします。

RDS DB インスタンスを使用する場合は、--db-instance-identifier オプションを指定します。Aurora DB クラスターを使用する場合は、代わりに --db-cluster-identifier オプションを指定します。

次の例では、Aurora MySQL プロキシを変更します。Aurora PostgreSQL プロキシにはポート 5432 があります。

aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [ { "Endpoint": "instance-9814.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-9814" }, { "Endpoint": "instance-8898.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-8898" }, { "Endpoint": "instance-1018.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-1018" }, { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "cluster-56-2020-02-25-1399" }, { "Endpoint": "instance-4330.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-4330" } ] } aws rds deregister-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier cluster-56-2020-02-25-1399 aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [] } aws rds register-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier provisioned-cluster { "DBProxyTargets": [ { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "provisioned-cluster" }, { "Endpoint": "gkldje.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "gkldje" }, { "Endpoint": "provisioned-1.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "provisioned-1" } ] }

RDS API を使用してプロキシを変更するには、ModifyDBProxyModifyDBProxyTargetGroupDeregisterDBProxyTargetsRegisterDBProxyTargets の各オペレーションを使用します。

ModifyDBProxy では、次のようなプロパティを変更できます。

  • プロキシで使用する一連の Secrets Manager シークレット。

  • TLS が必要かどうか。

  • アイドルクライアントのタイムアウト。

  • デバッグ用に SQL ステートメントからの追加情報をログに記録するかどうか。

  • Secrets Manager シークレットの取得に使用する IAM ロール。

  • プロキシで使用するセキュリティグループ。

ModifyDBProxyTargetGroup では、接続関連の設定や、ターゲットグループの名前を変更できます。現在、すべてのプロキシには default という名前のターゲットグループが 1 つ あります。このターゲットグループを使用する場合、プロキシの名前とターゲットグループ名 (default) を指定します。

DeregisterDBProxyTargets コマンドと RegisterDBProxyTargets コマンドでは、ターゲットグループを通じてプロキシが関連付けられている RDS DB インスタンスまたは Aurora DB クラスターを変更します。現在、各プロキシが接続できる RDS DB インスタンスまたは Aurora DB クラスターは 1 つです。ターゲットグループは、マルチ AZ 設定のすべての RDS DB インスタンス、または Aurora クラスター内のすべての DB インスタンスの接続の詳細を追跡します。

新しいデータベースユーザーの追加

状況に応じて、プロキシに関連付けられている RDS DB インスタンスや Aurora クラスターに新しいデータベースユーザーを追加できます。その場合は、Secrets Manager シークレットを追加または転用して、そのユーザーの認証情報を保存します。これを行うには、次のいずれかのオプションを選択します。

  • AWS Secrets Manager でのデータベース認証情報の設定」で説明している手順を使用して、新しい Secrets Manager シークレットを作成します。

  • IAM ロールを更新して、RDS Proxy に新しい Secrets Manager シークレットへのアクセスを許可します。そのためには、IAM ロールポリシーのリソースセクションを更新します。

  • 既存のユーザーを新しいユーザーに置き換える場合は、プロキシで既存のユーザーの Secrets Manager シークレットに保存されている認証情報を更新します。

データベースユーザーのパスワードの変更

状況に応じて、プロキシに関連付けられている RDS DB インスタンスや Aurora クラスターのデータベースユーザーのパスワードを変更できます。その場合は、対応する Secrets Manager シークレットを新しいパスワードで更新します。

接続の制限とタイムアウトの制御

RDS Proxy は、RDS DB インスタンスまたは Aurora DB クラスターの max_connections 設定を使用します。この設定は、プロキシが一度に開くことができる接続全体の上限を示します。Aurora クラスターや RDS マルチ AZ 設定で、プロキシが使用する max_connections 値は、Aurora プライマリインスタンスや RDS ライターインスタンスの値です。

RDS DB インスタンスまたは Aurora DB クラスターにこの値を設定するには、「DB パラメータグループを使用する」の手順に従います。以下の手順では、パラメータグループをデータベースに関連付け、パラメータグループの max_connections 値を編集する方法を示しています。

プロキシ設定の最大接続数は、プロキシに関連付けられているデータベースの max_connections 値の割合を表します。複数のアプリケーションのすべてで同じデータベースを使用している場合、アプリケーションごとに max_connections の特定の割合でプロキシを使用することで、接続クォータを効率的に分割できます。その場合は、同じデータベースに関連付けられているすべてのプロキシの割合の合計が 100% 以下であることを確認してください。

RDS Proxy はアイドル状態の接続を定期的に切断し、接続プールに戻します。このタイムアウト間隔を調整できます。これにより、アプリケーションは古いリソースを処理できます。特に、重要なデータベースリソースが保留されているときに誤って接続を開いたままにしている場合に対応できます。

接続プールの管理とモニタリング

接続プーリング」で説明しているように、接続プールは RDS Proxy の重要な機能です。次に、接続プールの効率的な使用方法について説明します。

接続プールは RDS Proxy によって管理されるため、アプリケーションコードを変更することなく、接続プールをモニタリングして接続の制限とタイムアウト間隔を調整できます。

プロキシごとに、接続プールで使用されるデータベース接続数の上限を指定できます。この設定では、RDS Proxy コンソールの接続プールの最大接続数フィールド、または AWS CLI や API の MaxConnectionsPercent パラメータを使用します。上限は割合 (%) で指定します。この割合は、データベースで設定されている最大接続数に適用されます。正確な数は、DB インスタンスのサイズと設定によって異なります。

例えば、データベースの最大接続数の 75% を使用するように RDS Proxy を設定したとします。MySQL の場合、最大値は max_connections 設定パラメータによって定義されます。この場合、最大接続数の残りの 25% は、他のプロキシや、プロキシを経由しない接続に割り当てることができます。場合によっては、プロキシで特定の時間に開いている接続の数が最大接続数の 75 パーセントに満たないことがあります。例えば、データベースに多数の同時接続がない場合や、一部の接続が長時間アイドル状態になっている場合があります。

接続プールで使用できる接続の総数は、RDS DB インスタンスや Aurora クラスターに適用される max_connections 設定を更新すると、変わります。

プロキシは、これらの接続のすべてを事前に予約するわけではありません。したがって、比較的大きな割合を指定できます。これらの接続は、プロキシがビジーとなって接続を必要とする状態になったときにのみ開かれます。

アプリケーションでデータベース接続を使用できるようになるまでの待機時間を選択できます。この設定では、RDS Proxy コンソールの接続借用タイムアウトフィールド、または AWS CLI や API の ConnectionBorrowTimeout パラメータを使用します。この設定では、タイムアウトエラーを返すまでに接続プールで接続が利用可能になるのを待機する時間を指定します。これは、接続数が最大値に達し、接続プールで利用可能な接続がなくなった場合に適用されます。また、例えば、フェイルオーバー操作が進行中であるなどの理由で、リクエストを処理するために使用できる適切なデータベースインスタンスがない場合にも適用されます。この設定を使用すると、アプリケーションコードでクエリタイムアウトを変更しなくても、アプリケーションに最適な待機期間を設定できます。

接続プール内のアイドル状態のデータベース接続をどのようにプロキシが切断するのかを制御できます。この設定では、AWS CLI や API の DBProxyTargetGroupMaxIdleConnectionsPercent パラメータを使用します。値を大きくすると、プロキシではアイドル状態のデータベース接続の大部分を開いたままにします。値を小さくすると、プロキシではアイドル状態のデータベース接続の大部分を閉じます。Aurora MySQL では、ターゲットグループが使用する RDS DB インスタンスまたは Aurora DB クラスターの max_connections 設定に対するパーセンテージで表されます。デフォルト値は 50% です。MaxIdleConnectionsPercent の値を変更するには、CLI コマンド modify-db-proxy-target-group または API 操作 ModifyDBProxyTargetGroup を使用します。

注記

RDS Proxy は、データベース接続が使用されなくなった 24 時間後にその接続を閉じます。プロキシは、アイドル状態の最大接続数の設定値に関係なく、このアクションを実行します。

ピン留めを回避する

データベースリクエストが以前のリクエストの状態情報に依存しない場合、多重化の効率が高まります。その場合、RDS Proxy は、各トランザクションの終了時に接続を再利用できます。このような状態情報の例には、SET ステートメントや SELECT ステートメントで変更できるほとんどの変数や設定パラメータが含まれます。クライアント接続の SQL トランザクションでは、デフォルトで、基となるデータベース接続を多重化できます。

プロキシへの接続は、ピン留めと呼ばれる状態に入る場合があります。接続がピン留めされると、以降の各トランザクションは、セッションが終了するまで、同じ基になるデータベース接続を使用します。また、他のクライアント接続は、セッションが終了するまでそのデータベース接続を再利用できません。クライアント接続がドロップされると、セッションは終了します。

RDS Proxy は、他のセッションに不適切なセッション状態の変化を検出すると、クライアント接続を特定の DB 接続に自動的にピン留めします。ピン留めにより、接続の再利用の有効性が低下します。すべての接続やほぼすべての接続でピン留めが発生する場合は、ピン留めが発生する状態を減らすようにアプリケーションコードやワークロードを変更します。

例えば、アプリケーションによってセッションの変数や設定パラメータが変更された場合、後続のステートメントでは変更後の変数やパラメータが有効であることに依存します。したがって、RDS Proxy はセッションの変数や構成設定の変更リクエストを処理する場合、そのセッションを DB 接続にピン留めします。これにより、セッション状態は、同じセッション内の後続のすべてのトランザクションで有効になります。

このルールは、設定可能なすべてのパラメータに適用されるわけではありません。RDS Proxy は、文字セット、照合、タイムゾーン、自動コミット、現在のデータベース、SQL モード、および session_track_schema 設定の変更を追跡します。したがって、これらの変更時に RDS Proxy はセッションをピン留めしません。この場合、RDS Proxy は、これらの設定の値が同じである他のセッションでのみ、接続を再利用します。

RDS Proxy のパフォーマンスチューニングでは、ピン留めを最小化してトランザクションレベルの接続の再利用 (多重化) を最大化します。そのためには、以下の操作を行います。

  • ピン留めの原因となる可能性のある不要なデータベースリクエストを避けます。

  • すべての接続間で変数と構成設定を一貫して設定します。これにより、これらの特定の設定を持つ接続が後続のセッションで再利用される可能性が高くなります。

    ただし、PostgreSQL では、変数の設定によりセッションのピン留めが発生します。

  • セッションのピン留めフィルターをプロキシに適用します。特定の種類のオペレーションがアプリケーションの正常な動作に影響しないことがわかっている場合、これらのオペレーションを除外してセッションのピン留めを起こさないように指定できます。

  • CloudWatch メトリクス DatabaseConnectionsCurrentlySessionPinned をモニタリングして、ピン留めが発生する頻度を確認します。このメトリクスおよび他の CloudWatch メトリクスの詳細については、「Amazon CloudWatch を使用した RDS Proxy のモニタリング」を参照してください。

  • SET ステートメントを使用して各クライアント接続を同等に初期化する場合、トランザクションレベルの多重化を維持したまま、この初期化を実行できます。この場合、初期セッション状態を設定するステートメントを、プロキシが使用する初期化クエリに移動します。このプロパティは、セミコロンで区切られた 1 つ以上の SQL ステートメントを含む文字列です。

    例えば、特定の設定パラメータを設定する初期化クエリをプロキシに定義できます。これにより、RDS Proxy でプロキシの新しい接続を設定するたびに、これらの設定が適用されます。トランザクションレベルの多重化を妨げないように、アプリケーションコードから対応する SET ステートメントを削除できます。

    重要

    MySQL データベースに関連付けられているプロキシの場合、初期化クエリで設定パラメータ sql_auto_is_nulltrue または 0 以外の値に設定しないでください。その場合、アプリケーションの動作が正常でなくなる場合があります。

以下の場合は、多重化が予期しない動作をもたらす可能性があるため、プロキシはセッションを現在の接続にピン留めします。

  • ステートメントのテキストサイズが 16 KB を超える場合、プロキシはセッションをピン留めします。

  • プリペアドステートメントの場合、プロキシはセッションをピン留めします。このルールは、プリペアドステートメントで SQL テキストを使用するか、バイナリプロトコルを使用するかに関係なく、適用されます。

  • 明示的な MySQL ステートメントである LOCK TABLELOCK TABLES、または FLUSH TABLES WITH READ LOCK が原因でプロキシによるセッションのピン留めが発生します。

  • ユーザー変数またはシステム変数 (例外あり) を設定した場合、プロキシはセッションをピン留めします。この状況によって接続の再利用が制限されすぎる場合は、SET オペレーションでピン留めを発生させないように選択できます。SessionPinningFilters プロパティを設定する方法については、「RDS Proxy の作成」を参照してください。

  • 一時テーブルを作成した場合、プロキシはセッションをピン留めします。これにより、トランザクションの境界に関係なく、一時テーブルの内容がセッション全体で保持されます。

  • MySQL 関数 ROW_COUNTFOUND_ROWS、および LAST_INSERT_ID を呼び出すと、ピン留めが発生する場合があります。

    これらの関数によりピン留めが発生する正確な状況は、MySQL 5.6 および MySQL 5.7 と互換性のある Aurora MySQL バージョン間で異なる場合があります。

MySQL ストアドプロシージャやストアド関数を呼び出しても、ピン留めは発生しません。RDS Proxy は、このような呼び出しに伴うセッション状態の変更を検出しません。したがって、アプリケーションによってストアドルーチン内でセッション状態が変更されないことを確認し、そのセッション状態がトランザクション間で維持されるようにします。例えば、ストアドプロシージャがトランザクション間で維持されることを意図した一時テーブルを作成する場合、このアプリケーションは現在 RDS Proxy と互換性がありません。

PostgreSQL の場合、次の操作に伴ってピン留めも発生します。

  • SET コマンドの使用

  • JDBC のデフォルト設定を使用するなど、拡張クエリプロトコルの使用

  • 一時シーケンス、テーブル、またはビューの作成

  • カーソルの宣言

  • セッション状態の破棄

  • 通知チャネルでのリッスン

  • auto_explain などのライブラリモジュールのロード

  • nextvalsetval などの関数を使用したシーケンスの操作

  • pg_advisory_lockpg_try_advisory_lock などの機能を使用したロックの操作

  • 準備されたステートメントの使用、パラメータの設定、またはパラメータのデフォルトへのリセット

アプリケーションの動作に関する専門知識がある場合は、特定のアプリケーションステートメントについてピン留め動作をスキップできます。これを行うには、プロキシの作成時に [セッションのピン留めフィルタ] オプションを選択します。現在、セッションの変数や構成設定の定義により発生するセッションのピン留めを回避できます。

プロキシでのピン留めの発生回数のメトリクスについては、「Amazon CloudWatch を使用した RDS Proxy のモニタリング」を参照してください。

RDS Proxy の削除

不要になったプロキシは削除できます。プロキシを使用していたアプリケーションが無効になった場合は、プロキシを削除できます。または、プロキシに関連付けられている DB インスタンスやクラスターがサービスから外された場合に、プロキシを削除できます。

プロキシを削除するには

  1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、[プロキシ] を選択します。

  3. リストから削除するプロキシを選択します。

  4. [Delete Proxy (プロキシの削除)] を選択します。

DB プロキシを削除するには、AWS CLI コマンド delete-db-proxy を使用します。該当する関連付けを削除するには、deregister-db-proxy-targets コマンドも使用します。

aws rds delete-db-proxy --name proxy_name
aws rds deregister-db-proxy-targets --db-proxy-name proxy_name [--target-group-name target_group_name] [--target-ids comma_separated_list] # or [--db-instance-identifiers instance_id] # or [--db-cluster-identifiers cluster_id]

DB プロキシを削除するには、Amazon RDS API 関数 DeleteDBProxy を呼び出します。関連する項目と関連付けを削除するには、関数 DeleteDBProxyTargetGroupDeregisterDBProxyTargets も呼び出します。