RDS Proxy のトラブルシューティング - Amazon Relational Database Service

RDS Proxy のトラブルシューティング

以下に、いくつかの一般的な RDS Proxy 問題のトラブルシューティングのヒントと、RDS Proxy の CloudWatch ログに関する情報を示します。

RDS Proxy ログでは、各エントリの前に、関連付けられたプロキシエンドポイントの名前が付けられます。この名前は、ユーザー定義のエンドポイントに指定した名前、またはプロキシのデフォルトのエンドポイントを使用した読み取り/書き込みリクエストの特別な名前 default にすることができます。プロキシエンドポイントの詳細については、「Amazon RDS Proxy エンドポイントの操作」を参照してください。

プロキシでの接続の検証

次のコマンドを使用して、接続機構のすべてのコンポーネントが他のコンポーネントと通信できることを検証できます。

describe-db-proxies コマンドを使用して、プロキシ自体を調べます。また、describe-db-proxy-target-groups を使用して、関連するターゲットグループを調べます。ターゲットの詳細が、プロキシに関連付ける RDS DB インスタンスまたは Aurora DB クラスターと一致することを確認します。以下のようなコマンドを使用します。

aws rds describe-db-proxies --db-proxy-name $DB_PROXY_NAME aws rds describe-db-proxy-target-groups --db-proxy-name $DB_PROXY_NAME

プロキシが基になるデータベースに接続できることを確認するには、describe-db-proxy-targets コマンドを使用して、ターゲットグループで指定されたターゲットを調べます。以下のようなコマンドを使用します。

aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME

describe-db-proxy-targets コマンドの出力には、TargetHealth フィールドが含まれます。State 内のフィールド ReasonDescription、および TargetHealth を調べて、プロキシが基になる DB インスタンスと通信できるかどうかを確認できます。

  • State の値 AVAILABLE は、プロキシが DB インスタンスに接続できることを示します。

  • State の値 UNAVAILABLE は、一時的または永続的な接続の問題を示します。この場合は、Reason および Description フィールドを調べます。例えば、Reason の値が PENDING_PROXY_CAPACITY の場合は、プロキシがスケーリングオペレーションを完了した後で、接続を再試行します。Reason の値が UNREACHABLECONNECTION_FAILED、または AUTH_FAILURE の場合は、Description フィールドの説明が問題の診断に役立ちます。

  • State フィールドでは、REGISTERING または AVAILABLE に変わるまでの短い間、値が UNAVAILABLE になる場合があります。

次の Netcat コマンド (nc) が成功した場合は、ログインしている EC2 インスタンスや他のシステムからプロキシエンドポイントにアクセスできます。このコマンドは、プロキシおよび関連付けられたデータベースと同じ VPC 内に存在していない場合、失敗を報告します。同じ VPC に存在していなくても、データベースに直接ログインできる場合があります。ただし、同じ VPC 内に存在していない限り、プロキシにはログインできません。

nc -zx MySQL_proxy_endpoint 3306 nc -zx PostgreSQL_proxy_endpoint 5432

次のコマンドを使用して、EC2 インスタンスに必要なプロパティがあることを確認できます。特に、EC2 インスタンスの VPC は、プロキシが接続する先の RDS DB インスタンスまたは Aurora DB クラスターの VPC と同じである必要があります。

aws ec2 describe-instances --instance-ids your_ec2_instance_id

プロキシで使用されている Secrets Manager シークレットを確認します。

aws secretsmanager list-secrets aws secretsmanager get-secret-value --secret-id your_secret_id

SecretString によって表示される get-secret-value フィールドが JSON 文字列としてエンコードされ、この文字列に username フィールドと password フィールドが含まれていることを確認します。次の例は、SecretString フィールドの形式を示しています。

{ "ARN": "some_arn", "Name": "some_name", "VersionId": "some_version_id", "SecretString": '{"username":"some_username","password":"some_password"}', "VersionStages": [ "some_stage" ], "CreatedDate": some_timestamp }

一般的な問題と解決策

RDS Proxy の使用時に発生する可能性があるいくつかの一般的な問題の考えられる原因と解決策については、以下を参照してください。

新しいプロキシの作成時やプロキシへの接続時に、次の問題が発生することがあります。

エラー 原因または回避策

403: The security token included in the request is invalid

新しい IAM ロールを作成せずに、既存の IAM ロールを選択します。

MySQL プロキシへの接続時に次の問題が発生することがあります。

エラー 原因または回避策
ERROR 1040 (HY000): Connections rate limit exceeded (limit_value) クライアントからプロキシへの接続リクエストのレートが制限を超えました。
ERROR 1040 (HY000): IAM authentication rate limit exceeded クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。
ERROR 1040 (HY000): Number simultaneous connections exceeded (limit_value) クライアントからプロキシへの同時接続リクエストの数が制限を超えました。

ERROR 1045 (28000): Access denied for user 'DB_USER'@'%' (using password: YES)

次のような原因が考えられます。

  • プロキシで使用される Secrets Manager シークレットが既存のデータベースユーザーのユーザー名およびパスワードと一致しません。Secrets Manager シークレットの認証情報を更新します。または、データベースユーザーが存在し、そのパスワードがシークレットのものと同じであることを確認します。

ERROR 1105 (HY000): Unknown error 不明なエラーが発生しました。
ERROR 1231 (42000): Variable ''character_set_client'' can't be set to the value of value

character_set_client パラメータに設定した値が無効です。例えば、値 ucs2 は、MySQL サーバーをクラッシュさせる可能性があるため、有効ではありません。

ERROR 3159 (HY000): This RDS Proxy requires TLS connections.

プロキシで [Transport Layer Security が必要] 設定を有効にしましたが、MySQL クライアントで接続にパラメータ ssl-mode=DISABLED が含まれていました。次のいずれかを行います。

  • プロキシの [Transport Layer Security が必要] 設定を無効にします。

  • MySQL クライアントで ssl-mode=REQUIRED の最小設定を使用してデータベースに接続します。

ERROR 2026 (HY000): SSL connection error: Internal Server Error

プロキシへの TLS ハンドシェイクが失敗しました。次のような原因が考えられます。

  • SSL は必須ですが、サーバーではサポートされていません。

  • 内部サーバーエラーが発生しました。

  • 不正なハンドシェイクが発生しました。

ERROR 9501 (HY000): Timed-out waiting to acquire database connection

プロキシは、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。

  • 最大接続数に達したため、プロキシはデータベース接続を確立できません

  • データベースが使用不能であるため、プロキシはデータベース接続を確立できません。

PostgreSQL プロキシへの接続中に次の問題が発生することがあります。

エラー 原因 ソリューション

IAM authentication is allowed only with SSL connections.

ユーザーが、PostgreSQL クライアントで sslmode=disable を設定して IAM 認証を使用してデータベースに接続しようとしました。

ユーザーは、PostgreSQL クライアントで sslmode=require の最小設定を使用して、データベースに接続する必要があります。詳細については、PostgreSQL の SSL サポートに関するドキュメントを参照してください。

This RDS Proxy requires TLS connections.

ユーザーは [Transport Layer Security が必要] オプションを有効にしましたが、PostgreSQL クライアントで sslmode=disable を使用して接続しようとしました。

このエラーを修正するには、以下のいずれかを行います。

  • プロキシの [Transport Layer Security が必要] オプションを無効にします。

  • PostgreSQL クライアントで sslmode=allow の最小設定を使用してデータベースに接続します。

IAM authentication failed for user user_name. Check the IAM token for this user and try again.

このエラーの原因としては、以下が考えられます。

  • クライアントが不正な IAM ユーザー名を指定した。

  • クライアントがユーザーの不正な IAM 認証トークンを指定した。

  • クライアントが使用している IAM ポリシーに必要なアクセス許可がない。

  • クライアントがユーザーの期限切れの IAM 認証トークンを指定した。

このエラーを修正する方法は次のとおりです。

  1. 指定した IAM ユーザーが存在することを確認します。

  2. IAM 認証トークンが指定した IAM ユーザーに属することを確認します。

  3. IAM ポリシーに RDS への適切なアクセス許可があることを確認します。

  4. 使用した IAM 認証トークンが有効であることを確認します。

This RDS proxy has no credentials for the role role_name. Check the credentials for this role and try again.

このロールには Secrets Manager シークレットはありません。

このロールの Secrets Manager シークレットを追加します。

RDS supports only IAM or MD5 authentication.

プロキシへの接続に使用されているデータベースクライアントが、SCRAM-SHA-256 など、プロキシで現在サポートされていない認証メカニズムを使用しています。

IAM 認証を使用していない場合は、MD5 パスワード認証のみを使用してください。

A user name is missing from the connection startup packet. Provide a user name for this connection.

プロキシへの接続に使用されているデータベースクライアントが、接続の確立を試みるときにユーザー名を送信していません。

選択した PostgreSQL クライアントを使用してプロキシへの接続を設定するときは、必ずユーザー名を定義してください。

Feature not supported: RDS Proxy supports only version 3.0 of the PostgreSQL messaging protocol.

プロキシへの接続に使用される PostgreSQL クライアントは、3.0 より古いプロトコルを使用します。

3.0 メッセージングプロトコルをサポートする、より新しい PostgreSQL クライアントを使用します。PostgreSQL psql CLI を使用している場合は、バージョン 7.4 以降を使用します。

Feature not supported: RDS Proxy currently doesn't support streaming replication mode.

プロキシへの接続に使用されている PostgreSQL クライアントが、ストリーミングレプリケーションモードを使用しようとしています。このモードは、現在 RDS プロキシでサポートされていません。

接続に使用されている PostgreSQL クライアントでストリーミングレプリケーションモードをオフにします。

Feature not supported: RDS Proxy currently doesn't support the option option_name.

プロキシへの接続に使用されている PostgreSQL クライアントが、起動メッセージを通じて、RDS プロキシで現在サポートされていないオプションをリクエストしています。

接続に使用されている PostgreSQL クライアントで、上記のメッセージから、サポートされていないと表示されているオプションをオフにします。

The IAM authentication failed because of too many competing requests.

クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。

PostgreSQL クライアントからの IAM 認証を使用した接続の確立速度を下げます。

The maximum number of client connections to the proxy exceeded number_value.

クライアントからプロキシへの同時接続リクエストの数が制限を超えました。

PostgreSQL クライアントからこの RDS プロキシへのアクティブな接続の数を減らします。

Rate of connection to proxy exceeded number_value.

クライアントからプロキシへの接続リクエストのレートが制限を超えました。

PostgreSQL クライアントからの接続の確立速度を下げます。

The password that was provided for the role role_name is wrong.

このロールのパスワードが Secrets Manager シークレットと一致しません。

Secrets Manager でこのロールのシークレットをチェックして、パスワードが PostgreSQL クライアントで使用されているものと同じかどうかを確認します。

The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.

IAM 認証に使用される IAM トークンに問題があります。

新しい認証トークンを生成し、新しい接続で使用します。

IAM is allowed only with SSL connections.

クライアントが IAM 認証を使用して接続しようとしましたが、SSL が有効になっていませんでした。

PostgreSQL クライアントで SSL を有効にします。

Unknown error.

不明なエラーが発生しました。

AWS サポートに連絡して、問題の調査を依頼してください。

Timed-out waiting to acquire database connection.

プロキシは、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。

  • 最大接続数に達したため、プロキシはデータベース接続を確立できません。

  • データベースが使用不能であるため、プロキシはデータベース接続を確立できません。

考えられる解決策:

  • RDS DB インスタンスのターゲットまたは Aurora DB クラスターステータスをチェックして、利用できないかどうかを確認します。

  • 実行時間の長いトランザクションやクエリが実行されているかどうかを確認します。接続プールからのデータベース接続を長時間使用できます。

Request returned an error: database_error.

プロキシから確立されたデータベース接続がエラーを返しました。

解決策は、具体的なデータベースエラーによって異なります。1 つの例は、Request returned an error: database "your-database-name" does not exist です。これは、指定されたデータベース名、またはデータベース名として使用されているユーザー名 (データベース名が指定されていない場合) がデータベースサーバーに存在しないことを意味します。