

# RDS Proxy のトラブルシューティング
<a name="rds-proxy.troubleshooting"></a>

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

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

**Topics**
+ [プロキシでの接続の検証](#rds-proxy-verifying)
+ [一般的な問題と解決策](#rds-proxy-diagnosis)
+ [RDS for MySQL での RDS Proxy の問題のトラブルシューティング](#rds-proxy-MySQL-troubleshooting)
+ [RDS for PostgreSQL での RDS Proxy の問題のトラブルシューティング](#rds-proxy-PostgreSQL-troubleshooting)

## プロキシでの接続の検証
<a name="rds-proxy-verifying"></a>

 以下のコマンドを使用して、接続内のプロキシ、データベース、コンピューティングインスタンスなどのすべてのコンポーネントが相互に通信できることを確認できます。

 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) コマンドを使用して、プロキシ自体を調べます。また、[describe-db-proxy-target-groups](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-target-groups.html) コマンドを使用して、関連するターゲットグループを確認します。ターゲットの詳細が、プロキシに関連付ける RDS 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](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html) コマンドを使用して、ターゲットグループで指定されたターゲットを調べます。以下のようなコマンドを使用します。

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

 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html) コマンドの出力には、`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 -zx PostgreSQL_proxy_endpoint 5432
```

 次のコマンドを使用して、EC2 インスタンスに必要なプロパティがあることを確認できます。特に、EC2 インスタンスの VPC は、プロキシが接続する先の の 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
}
```

IAM 認証の問題をトラブルシューティングする場合は、以下を確認してください。
+ データベースで IAM 認証が有効になっています。
+ プロキシは正しい認証スキームで設定されています。
+ プロキシに提供される IAM ロールの IAM ポリシーは、適切なデータベースとそのユーザー名に必要な `rds-db:connect` アクセス許可を付与します。
+ エンドツーエンド IAM 認証の場合、IAM ユーザーまたはロール名に一致するデータベースユーザーが存在します。
+ SSL/TLS は接続に対して有効になっています。

## 一般的な問題と解決策
<a name="rds-proxy-diagnosis"></a>

このセクションでは、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-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)」を参照してください。 | 
|  失敗  | RDS-EVENT-0275 |  RDS は DB プロキシ*名*への一部の接続をスロットリングしました。クライアントからプロキシへの同時接続リクエストの数が制限を超えました。  | 

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


|  エラー  |  原因または回避策  | 
| --- | --- | 
|   `403: The security token included in the request is invalid`   |  新しい IAM ロールを作成せずに、既存の IAM ロールを選択します。 | 

## RDS for MySQL での RDS Proxy の問題のトラブルシューティング
<a name="rds-proxy-MySQL-troubleshooting"></a>

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


|  エラー  |  原因または回避策  | 
| --- | --- | 
|  ERROR 1040 (HY000): Connections rate limit exceeded (limit\$1value)  |  クライアントからプロキシへの接続リクエストのレートが制限を超えました。 | 
|  ERROR 1040 (HY000): IAM authentication rate limit exceeded  |  クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。 | 
|  ERROR 1040 (HY000): Number simultaneous connections exceeded (limit\$1value)  |  クライアントからプロキシへの同時接続リクエストの数が制限を超えました。 | 
|   `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\$1set\$1client'' 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` が含まれていました。次のいずれかを行います。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  ERROR 2026 (HY000): SSL connection error: Internal Server Error  |   プロキシへの TLS ハンドシェイクが失敗しました。次のような原因が考えられます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  ERROR 9501 (HY000): Timed-out waiting to acquire database connection  |   プロキシは、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 

## RDS for PostgreSQL での RDS Proxy の問題のトラブルシューティング
<a name="rds-proxy-PostgreSQL-troubleshooting"></a>

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


|  エラー  |  原因  |  ソリューション  | 
| --- | --- | --- | 
|   `ERROR 28000: IAM authentication is allowed only with SSL connections.`   |   ユーザーが、PostgreSQL クライアントで `sslmode=disable` を設定して IAM 認証を使用してデータベースに接続しようとしました。  |   ユーザーは、PostgreSQL クライアントで `sslmode=require` の最小設定を使用して、データベースに接続する必要があります。詳細については、[PostgreSQL の SSL サポート](https://www.postgresql.org/docs/current/libpq-ssl.html)に関するドキュメントを参照してください。  | 
|  `ERROR 28000: 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 Proxy の IAM 認証の設定](rds-proxy-iam-setup.md)」を参照してください。  | 
|  `ERROR 28000: RDS supports only IAM, MD5, or SCRAM authentication.`   |   プロキシへの接続に使用されているデータベースクライアントが、プロキシで現在サポートされていない認証メカニズムを使用しています。  |   IAM 認証を使用していない場合は、MD5 または SCRAM パスワード認証を使用してください。  | 
|  `ERROR 28000: A user name is missing from the connection startup packet. Provide a user name for this connection.`   |   プロキシへの接続に使用されているデータベースクライアントが、接続の確立を試みるときにユーザー名を送信していません。  |   選択した PostgreSQL クライアントを使用してプロキシへの接続を設定するときは、必ずユーザー名を定義してください。  | 
|  `ERROR 28000: IAM is allowed only with SSL connections.`   |   クライアントが IAM 認証を使用して接続しようとしましたが、SSL が有効になっていませんでした。  |   PostgreSQL クライアントで SSL を有効にします。  | 
|  `ERROR 28000: This RDS Proxy requires TLS connections.`   |   ユーザーは [**Transport Layer Security が必要**] オプションを有効にしましたが、PostgreSQL クライアントで `sslmode=disable` を使用して接続しようとしました。  |   このエラーを修正するには、以下のいずれかを行います。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR 28P01: IAM authentication failed for user user_name. Check the IAM token for this user and try again.`   |   このエラーの原因としては、以下が考えられます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   このエラーを修正する方法は次のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR 28P01: The password that was provided for the role role_name is wrong.`   |   このロールのパスワードが Secrets Manager シークレットと一致しません。  |   Secrets Manager でこのロールのシークレットをチェックして、パスワードが PostgreSQL クライアントで使用されているものと同じかどうかを確認します。  | 
|  `ERROR 28P01: The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.`   |   IAM 認証に使用される IAM トークンに問題があります。  |   新しい認証トークンを生成し、新しい接続で使用します。  | 
|  `ERROR 0A000: 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 以降を使用します。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support streaming replication mode.`   |   プロキシへの接続に使用されている PostgreSQL クライアントが、ストリーミングレプリケーションモードを使用しようとしています。このモードは、現在 RDS Proxy でサポートされていません。  |   接続に使用されている PostgreSQL クライアントでストリーミングレプリケーションモードをオフにします。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support the option option_name.`   |   プロキシへの接続に使用されている PostgreSQL クライアントが、起動メッセージを通じて、RDS Proxy で現在サポートされていないオプションをリクエストしています。  |   接続に使用されている PostgreSQL クライアントで、上記のメッセージから、サポートされていないと表示されているオプションをオフにします。  | 
|  `ERROR 53300: The IAM authentication failed because of too many competing requests.`   |   クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。  |   PostgreSQL クライアントからの IAM 認証を使用した接続の確立速度を下げます。  | 
|  `ERROR 53300: The maximum number of client connections to the proxy exceeded number_value.`   |   クライアントからプロキシへの同時接続リクエストの数が制限を超えました。  |   PostgreSQL クライアントからこの RDS Proxy へのアクティブな接続の数を減らします。  | 
|  `ERROR 53300: Rate of connection to proxy exceeded number_value.`   |   クライアントからプロキシへの接続リクエストのレートが制限を超えました。  |   PostgreSQL クライアントからの接続の確立速度を下げます。  | 
|  `ERROR XX000: Unknown error.`   |   不明なエラーが発生しました。  |   AWS サポートに連絡して、問題の調査を依頼してください。  | 
|  `ERROR 08000: Timed-out waiting to acquire database connection.`   |   プロキシは、`ConnectionBorrowTimeout` 設定で指定された期間内に、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   以下の解決策が対象となります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR XX000: Request returned an error: database_error.`   |   プロキシから確立されたデータベース接続がエラーを返しました。  |   解決策は、具体的なデータベースエラーによって異なります。1 つの例は、`Request returned an error: database "your-database-name" does not exist` です。これは、指定されたデータベース名がデータベースサーバーに存在しないことになります。または、データベース名として使用されているユーザー名 (データベース名が指定されていない場合) がサーバーに存在しないことになります。  | 
|  `ERROR 53300: The IAM authentication failed because of too many competing requests.`  |  クライアントからプロキシへの IAM 認証による同時リクエストの数が制限を超えました。  |  PostgreSQL クライアントからの IAM 認証を使用した接続の確立速度を下げます。  | 
|  `ERROR 28000: Enable IAM authentication for the client connection to the proxy and try again.`  |  プロキシへのクライアント接続で IAM 認証が有効になっていないため、RDS Proxy はデータベースに接続できません。これは、プロキシの `DefaultAuthScheme` パラメータが登録済みユーザーで `IAM_AUTH` に設定されているが、クライアントが IAM 認証の代わりにパスワード認証を使用している場合に発生します。  |  プロキシへのクライアント接続の IAM 認証を有効にして、もう一度試してください。  | 
|  `ERROR 28000: Configure IAM authentication as the DefaultAuthScheme in your proxy and try again.`  |  `DefaultAuthScheme` が `IAM_AUTH` に設定されていないため、RDS Proxy はデータベースに接続できません。プロキシの `DefaultAuthScheme` パラメータは `NONE` に設定されていますが、クライアントは IAM 認証を使用しようとしています。  |  プロキシの `DefaultAuthScheme` を `IAM_AUTH` に設定して、もう一度試してください。  | 

### 削除された `postgres` データベースのトラブルシューティング
<a name="rds-proxy-PostgreSQL-troubleshooting.postgresDBDelete"></a>

`postgres` データベースを誤ってインスタンスから削除した場合は、データベースを復元してインスタンスへの接続を回復する必要があります。以下のコマンドを DB インスタンス内で実行します。

```
CREATE DATABASE postgres;
GRANT CONNECT ON DATABASE postgres TO rdsproxyadmin;
```