RDS Proxy のトラブルシューティング
以下に、いくつかの一般的な RDS Proxy 問題のトラブルシューティングのヒントと、RDS Proxy の CloudWatch ログに関する情報を示します。
RDS Proxy ログでは、各エントリの前に、関連付けられたプロキシエンドポイントの名前が付けられます。この名前には、ユーザー定義のエンドポイントに指定した名前を使えます。または、読み取り/書き込みリクエストを実行するプロキシのデフォルトエンドポイントの特別な名前 default
にすることができます。プロキシエンドポイントの詳細については、「Amazon RDS Proxy エンドポイントの操作」を参照してください。
プロキシでの接続の検証
以下のコマンドを使用して、接続内のプロキシ、データベース、コンピューティングインスタンスなどのすべてのコンポーネントが相互に通信できることを確認できます。
describe-db-proxies コマンドを使用して、プロキシ自体を調べます。また、describe-db-proxy-target-groups コマンドを使用して、関連するターゲットグループを確認します。ターゲットの詳細が、プロキシに関連付ける Aurora クラスターと一致していることを確認します。以下のようなコマンドを使用します。
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
内のフィールド Reason
、Description
、および TargetHealth
を調べて、プロキシが基になる DB インスタンスと通信できるかどうかを確認できます。
-
State
の値AVAILABLE
は、プロキシが DB インスタンスに接続できることを示します。 -
State
の値UNAVAILABLE
は、一時的または永続的な接続の問題を示します。この場合は、Reason
およびDescription
フィールドを調べます。例えば、Reason
の値がPENDING_PROXY_CAPACITY
の場合は、プロキシがスケーリングオペレーションを完了した後で、接続を再試行します。Reason
の値がUNREACHABLE
、CONNECTION_FAILED
、またはAUTH_FAILURE
の場合は、Description
フィールドの説明が問題の診断に役立ちます。 -
State
フィールドでは、REGISTERING
またはAVAILABLE
に変わるまでの短い間、値がUNAVAILABLE
になる場合があります。
次の Netcat コマンド (nc
) が成功した場合は、ログインしている EC2 インスタンスや他のシステムからプロキシエンドポイントにアクセスできます。このコマンドは、プロキシおよび関連付けられたデータベースと同じ VPC 内に存在していない場合、失敗を報告します。同じ VPC に存在していなくても、データベースに直接ログインできる場合があります。ただし、同じ VPC 内に存在していない限り、プロキシにはログインできません。
nc -zx
MySQL_proxy_endpoint
3306 nc -zxPostgreSQL_proxy_endpoint
5432
次のコマンドを使用して、EC2 インスタンスに必要なプロパティがあることを確認できます。特に、EC2 インスタンスの VPC は、プロキシが接続する先の RDS DB インスタンス Aurora クラスターの 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
get-secret-value
によって表示される SecretString
フィールドが 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 を使用する際の一般的な問題と考えられる解決策について説明します。
aws rds describe-db-proxy-targets
CLI コマンドの実行後、TargetHealth
の説明に Proxy does not have any registered
credentials
と記載されている場合は、以下を確認してください。
-
ユーザーがプロキシにアクセスするための認証情報が登録されています。
-
プロキシが使用する Secrets Manager シークレットにアクセスする IAM ロールが有効であること。
DB プロキシの作成時や接続時に、次の RDS イベントが発生することがあります。
カテゴリ | RDS イベント ID | 説明 |
---|---|---|
失敗 |
RDS-EVENT-0243 | サブネットに十分な IP アドレスがないため、RDS はプロキシの容量をプロビジョニングできませんでした。この問題を解決するには、サブネットの未使用の IP アドレスが最小限であることを確認してください。インスタンスクラスの推奨数を決定するには、「IP アドレス容量の計画」を参照してください。 |
失敗 |
RDS-EVENT-0275 |
RDS は DB プロキシ |
新しいプロキシの作成時やプロキシへの接続時に、次の問題が発生することがあります。
エラー | 原因または回避策 |
---|---|
|
新しい IAM ロールを作成せずに、既存の IAM ロールを選択します。 |
MySQL プロキシへの接続時に次の問題が発生することがあります。
エラー | 原因または回避策 |
---|---|
ERROR 1040 (HY000): Connections rate limit exceeded (
|
クライアントからプロキシへの接続リクエストのレートが制限を超えました。 |
ERROR 1040 (HY000): IAM authentication rate limit exceeded
|
クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。 |
ERROR 1040 (HY000): Number simultaneous connections exceeded (
|
クライアントからプロキシへの同時接続リクエストの数が制限を超えました。 |
|
プロキシで使用される Secrets Manager シークレットが既存のデータベースユーザーのユーザー名およびパスワードと一致しません。Secrets Manager シークレットの認証情報を更新します。または、データベースユーザーが存在し、そのパスワードがシークレットのものと同じであることを確認します。 |
ERROR 1105 (HY000): Unknown error
|
不明なエラーが発生しました。 |
ERROR 1231 (42000): Variable ''character_set_client'' can't be set to the value of
|
|
ERROR 3159 (HY000): This RDS Proxy requires TLS connections.
|
プロキシで [Transport Layer Security が必要] 設定を有効にしましたが、MySQL クライアントで接続にパラメータ
|
ERROR 2026 (HY000): SSL connection error: Internal Server
|
プロキシへの TLS ハンドシェイクが失敗しました。次のような原因が考えられます。
|
ERROR 9501 (HY000): Timed-out waiting to acquire database connection
|
プロキシは、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。
|
PostgreSQL プロキシへの接続中に次の問題が発生することがあります。
エラー | 原因 | ソリューション |
---|---|---|
|
ユーザーが、PostgreSQL クライアントで |
ユーザーは、PostgreSQL クライアントで |
|
このロールには Secrets Manager シークレットはありません。 |
このロールの Secrets Manager シークレットを追加します。詳細については、「RDS Proxy の AWS Identity and Access Management (IAM) ポリシーの設定」を参照してください。 |
|
プロキシへの接続に使用されているデータベースクライアントが、プロキシで現在サポートされていない認証メカニズムを使用しています。 |
IAM 認証を使用していない場合は、MD5 または SCRAM パスワード認証を使用してください。 |
|
プロキシへの接続に使用されているデータベースクライアントが、接続の確立を試みるときにユーザー名を送信していません。 |
選択した PostgreSQL クライアントを使用してプロキシへの接続を設定するときは、必ずユーザー名を定義してください。 |
|
クライアントが IAM 認証を使用して接続しようとしましたが、SSL が有効になっていませんでした。 |
PostgreSQL クライアントで SSL を有効にします。 |
|
ユーザーは [Transport Layer Security が必要] オプションを有効にしましたが、PostgreSQL クライアントで |
このエラーを修正するには、以下のいずれかを行います。
|
|
このエラーの原因としては、以下が考えられます。
|
このエラーを修正する方法は次のとおりです。
|
|
このロールのパスワードが Secrets Manager シークレットと一致しません。 |
Secrets Manager でこのロールのシークレットをチェックして、パスワードが PostgreSQL クライアントで使用されているものと同じかどうかを確認します。 |
|
IAM 認証に使用される IAM トークンに問題があります。 |
新しい認証トークンを生成し、新しい接続で使用します。 |
|
プロキシへの接続に使用される PostgreSQL クライアントは、3.0 より古いプロトコルを使用します。 |
3.0 メッセージングプロトコルをサポートする、より新しい PostgreSQL クライアントを使用します。PostgreSQL |
|
プロキシへの接続に使用されている PostgreSQL クライアントが、ストリーミングレプリケーションモードを使用しようとしています。このモードは、現在 RDS Proxy でサポートされていません。 |
接続に使用されている PostgreSQL クライアントでストリーミングレプリケーションモードをオフにします。 |
|
プロキシへの接続に使用されている PostgreSQL クライアントが、起動メッセージを通じて、RDS Proxy で現在サポートされていないオプションをリクエストしています。 |
接続に使用されている PostgreSQL クライアントで、上記のメッセージから、サポートされていないと表示されているオプションをオフにします。 |
|
クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。 |
PostgreSQL クライアントからの IAM 認証を使用した接続の確立速度を下げます。 |
|
クライアントからプロキシへの同時接続リクエストの数が制限を超えました。 |
PostgreSQL クライアントからこの RDS Proxy へのアクティブな接続の数を減らします。 |
|
クライアントからプロキシへの接続リクエストのレートが制限を超えました。 |
PostgreSQL クライアントからの接続の確立速度を下げます。 |
|
不明なエラーが発生しました。 |
AWS サポートに連絡して、問題の調査を依頼してください。 |
|
プロキシは、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。
|
以下の解決策が対象となります。
|
|
プロキシから確立されたデータベース接続がエラーを返しました。 |
解決策は、具体的なデータベースエラーによって異なります。1 つの例は、 |