Amazon RDS DB インスタンスへの接続時に発生する問題をトラブルシューティングする方法を教えてください。
Amazon Relational Database Service (Amazon RDS) DB インスタンスに接続できない原因をトラブルシューティングしたいと考えています。
簡単な説明
Amazon RDS DB インスタンスへの接続が失敗する理由は次のとおりです。
- セキュリティグループ、ネットワークアクセスコントロールリスト (ACL)、またはローカルファイアウォールでは、DB インスタンスに接続するソースに対する認証アクセスが付与されていない場合。
- クライアントアプリケーションから DB インスタンスへのネットワークパスがルートテーブルに含まれていない場合。
- DB インスタンスへの接続に使用する DNS 名またはエンドポイントが誤っている場合。
- DB インスタンスがパブリックにアクセスできず、インターネット経由で接続できない場合。
- マルチ AZ DB インスタンスがフェイルオーバーしており、セカンダリ DB インスタンスがインバウンド接続を許可しないサブネットまたはルートテーブルを使用している場合。
- ユーザー認証に誤りがある場合。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Amazon RDS DB インスタンス接続の問題をトラブルシューティングするには、次のタスクを実行します。
自動診断を使用する
まずは自動ツールを使用して、接続の問題をすばやく特定します。
次の手順を実行します。
- 自動診断ツールを実行するには、次の start-automation-execution AWS Systems Manager コマンドを使用します。
注: EC2-INSTANCE-ID を EC2 インスタンス ID に、DB-INSTANCE-NAME を RDS インスタンス識別子に置き換えてください。aws ssm start-automation-execution \ --document-name "AWSSupport-TroubleshootConnectivityToRDS" \ --parameters "InstanceId=EC2-INSTANCE-ID,DBInstanceIdentifier=DB-INSTANCE-NAME" - オートメーションの結果を確認するには、次の get-automation-execution コマンドを実行します。
注: EXECUTION-ID を、ステップ 1 で取得した実行 ID に置き換えてください。aws ssm get-automation-execution \ --automation-execution-id EXECUTION-ID
ランブックの実行方法と確認内容の詳細については、AWSSupport-TroubleshootConnectivityToRDS を参照してください。
DB インスタンスのステータスを確認する
DB インスタンスが利用可能で、接続の準備ができていることを確認します。
次の手順を実行します。
- DB インスタンスのステータスを確認するには、次の describe-db-instances コマンドを実行します。
注: DB-INSTANCE-NAME を Amazon RDS インスタンス識別子に置き換えてください。aws rds describe-db-instances \ --db-instance-identifier DB-INSTANCE-NAME \ --query 'DBInstances[*].DBInstanceStatus' - 接続を試みる前に、ステータスが available と表示されるまで待機してください。新しいインスタンスまたは再起動されたインスタンスが使用可能になるまでに最大 20 分かかることがあります。
セキュリティグループのルールを確認する
セキュリティグループは Amazon RDS インスタンスへのネットワークアクセスを制御します。ソースからのトラフィックを許可していることを確認します。
次の手順を実行します。
- Amazon RDS インスタンスにアタッチされているセキュリティグループを特定するには、次の describe-db-instances コマンドを実行します。
注: DB-INSTANCE-NAME を RDS インスタンス識別子に置き換えてください。aws rds describe-db-instances \ --db-instance-identifier DB-INSTANCE-NAME \ --query 'DBInstances[*].VpcSecurityGroups[*].VpcSecurityGroupId' - 各セキュリティグループのインバウンドルールを確認するには、次の describe-security-groups コマンドを実行します。
注: SECURITY-GROUP-ID をステップ 1 で取得した各セキュリティグループ ID に置き換えてください。aws ec2 describe-security-groups \ --group-ids SECURITY-GROUP-ID \ --query 'SecurityGroups[*].IpPermissions' - IP アドレスを許可するルールを追加するには、次の authorize-security-group-ingress コマンドを実行します。
注: SECURITY-GROUP-ID をセキュリティグループ ID に置き換えてください。DATABASE-PORT をご使用のデータベースポート (MySQL の場合は 3306、PostgreSQL の場合は 5432) に置き換えてください。YOUR-IP-ADDRESS をパブリック IP アドレスに置き換えてください。aws ec2 authorize-security-group-ingress \ --group-id SECURITY-GROUP-ID \ --protocol tcp \ --port DATABASE-PORT \ --cidr YOUR-IP-ADDRESS/32
ネットワーク ACL ルールを確認する
ネットワークアクセスコントロールリスト (ACL) はサブネットレベルのセキュリティを提供します。データベーストラフィックを許可していることを確認してください。
次の手順を実行します。
- Amazon RDS サブネットのネットワークアクセスコントロールリスト (ACL) を識別するには、次の describe-network-acls コマンドを実行します。
注: SUBNET-ID を RDS サブネット ID に置き換えてください。aws ec2 describe-network-acls \ --filters "Name=association.subnet-id,Values=SUBNET-ID" \ --query 'NetworkAcls[*].NetworkAclId' - ネットワークアクセスコントロールリスト (ACL) ルールを確認するには、次の describe-network-acls コマンドを実行します。
注: NETWORK-ACL-ID をステップ 1 で取得したネットワーク ACL ID に置き換えてください。aws ec2 describe-network-acls \ --network-acl-ids NETWORK-ACL-ID \ --query 'NetworkAcls[*].Entries' - インバウンドルールがデータベースポートのトラフィックを許可し、アウトバウンドルールがエフェメラルポート (1024-65535) を許可していることを確認してください。
ルートテーブルの設定を確認する
ルートテーブルはネットワークトラフィックを誘導します。Amazon RDS インスタンスへの適切なルーティングが提供されていることを確認します。
次の手順を実行します。
- Amazon RDS サブネットのルートテーブルを確認するには、次の describe-route-tables コマンドを実行します。
CMD
注: SUBNET-ID を RDS サブネット ID に置き換えてください。 - パブリックアクセスの場合は、インターネットゲートウェイへのルートがあることを確認してください。
- プライベートアクセスの場合は、必要に応じて NAT ゲートウェイ、VPC ピアリング接続、または VPN ゲートウェイへのルートを確認してください。
詳細については、「Amazon RDS DB インスタンスの IP アドレスに関する問題をトラブルシューティングする方法を教えてください」を参照してください。
DNS 解決の失敗を確認する
Amazon RDS エンドポイントが正しい IP アドレスに解決されることを確認します。
次の手順を実行します。
-
クライアントから DNS 解決をテストするには、次のコマンドを実行します。
nslookup RDS-ENDPOINT注: RDS-ENDPOINT を RDS インスタンスのエンドポイントに置き換えてください。
-
dig コマンドでテストするには、次のコマンドを実行します。
dig RDS-ENDPOINT -
DNS 解決が失敗した場合は、Amazon VPC DNS 設定を確認するか、別の DNS サーバーを使用してください。
ネットワークの接続をテストする
データベース認証をテストする前に、RDS インスタンスへのネットワーク接続を確認してください。
次の手順を実行します。
-
Amazon RDS インスタンスへの接続をテストするには、次の telnet コマンドを実行します。
telnet RDS-ENDPOINT DATABASE-PORT注: RDS-ENDPOINT を RDS エンドポイントに、DATABASE-PORT をデータベースポートに置き換えてください。
-
netcat でテストするには、次のコマンドを実行します。
nc -zv RDS-ENDPOINT DATABASE-PORT -
接続に成功した場合、認証に関連した問題がある可能性があります。失敗した場合、問題はネットワークに関連しています。
詳細については、「Troubleshoot network connectivity to Amazon RDS databases using VPC Reachability Analyzer」(VPC Reachability Analyzer を使用して Amazon RDS データベースへのネットワーク接続をトラブルシューティングする) を参照してください。
データベース認証を確認する
データベースの認証情報と認証方法を確認してください。
次の手順を実行します。
- MySQL のパスワード認証をテストするには、次のコマンドを実行します。
注: RDS-ENDPOINT をエンドポイント、DATABASE-PORT をポート、USERNAME をデータベースのユーザー名に置き換えてください。mysql -h RDS-ENDPOINT -P DATABASE-PORT -u USERNAME -p - PostgreSQL のパスワード認証をテストするには、次のコマンドを実行します。
注: RDS-ENDPOINT、DATABASE-PORT、USERNAME、DATABASE-NAME をそれぞれ実際の値に置き換えてください。psql -h RDS-ENDPOINT -p DATABASE-PORT -U USERNAME -d DATABASE-NAME - 必要に応じてマスターパスワードをリセットするには、次の modify-db-instance コマンドを実行します。
注: DB-INSTANCE-NAME をインスタンス識別子に、NEW-PASSWORD を新しいパスワードに置き換えてください。aws rds modify-db-instance \ --db-instance-identifier DB-INSTANCE-NAME \ --master-user-password NEW-PASSWORD \ --apply-immediately
接続制限を確認する
Amazon RDS インスタンスが接続制限に達していないことを確認します。
次の手順を実行します。
-
MySQL の現在の接続を確認するには、データベースに接続して次のクエリを実行します。
SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections'; -
PostgreSQL の現在の接続を確認するには、次のクエリを実行します。
SELECT count(*) FROM pg_stat_activity; SHOW max_connections; -
MySQL の接続エラーを確認するには、次のクエリを実行します。
SHOW STATUS LIKE 'Connection_errors%'; SHOW STATUS LIKE 'Max_used_connections';
Amazon RDS インスタンスが接続制限に達した場合は、次の手順を実行してください。
-
終了させることができるアイドル状態の接続を特定するには、MySQL に対して次のクエリを実行します。
SELECT id, user, host, db, command, time, state, info FROM information_schema.processlist WHERE command = 'Sleep' AND time > 300 ORDER BY time DESC; -
MySQL でアイドル状態の接続を終了するには、次のコマンドを実行します。
CALL mysql.rds_kill(CONNECTION-ID);注: CONNECTION-ID を、ステップ 1 で取得した接続 ID に置き換えてください。
-
max_connections パラメータを引き上げるには、次の modify-db-parameter-group コマンドを実行します。
aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_connections,ParameterValue=NEW-VALUE,ApplyMethod=pending-reboot"注: PARAMETER-GROUP-NAME をパラメータグループ名に、NEW-VALUE を希望する接続制限値に置き換えてください。max_connections を変更した後は、再起動する必要があります。
-
パラメータの変更を適用するには、Amazon RDS インスタンスを再起動します。次の reboot-db-instance コマンドを実行します。
aws rds reboot-db-instance \ --db-instance-identifier DB-INSTANCE-NAME注: DB-INSTANCE-NAME を Amazon RDS インスタンス識別子に置き換えてください。
-
RDS プロキシを使用してコネクションプーリングを実装するには、次の create-db-proxy コマンドを実行します。
aws rds create-db-proxy \ --db-proxy-name PROXY-NAME \ --engine-family mysql \ --target-group-config DBInstanceIdentifiers=DB-INSTANCE-NAME \ --vpc-subnet-ids SUBNET-ID-1,SUBNET-ID-2 \ --auth AuthScheme=SECRETS,SecretArn=SECRET-ARN注: PROXY-NAME、DB-INSTANCE-NAME、SUBNET-ID-1、SUBNET-ID-2、SECRET-ARN を、それぞれ実際の値に置き換えてください。
ユーザー固有の接続制限を確認する
次の手順を実行します。
-
現在の max_user_connections を確認するには、次のクエリを実行します。
SHOW VARIABLES LIKE 'max_user_connections'; -
ユーザーごとの現在の接続数を確認するには、次のクエリを実行します。
SELECT user, COUNT(*) as connection_count FROM information_schema.processlist GROUP BY user ORDER BY connection_count DESC; -
特定のユーザーが接続制限に達したかどうかを確認するには、次のクエリを実行します。
SELECT user, max_user_connections FROM mysql.user WHERE user = 'USERNAME';注: USERNAME を、接続の問題が発生している特定のユーザー名に置き換えてください。
max_user_connections パラメータを使用すると、全体的な接続制限に達していない場合でも、特定のユーザーによる接続を防ぐことができます。
Amazon RDS インスタンスが最大ユーザー接続数に達した場合は、次の手順を実行します。
- max_user_connections パラメータをグローバルに引き上げるには、次の modify-db-parameter-group コマンドを実行します。
注: PARAMETER-GROUP-NAME をパラメータグループ名に、NEW-VALUE を希望するユーザーあたりの接続制限に置き換えてください。aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_user_connections,ParameterValue=NEW-VALUE,ApplyMethod=immediate" - 特定のユーザーアカウントの接続制限を変更するには、次のクエリを実行します。
注: USERNAME をユーザー名に、NEW-LIMIT をそのユーザーに対する希望の接続制限に置き換えてください。ALTER USER 'USERNAME'@'%' WITH MAX_USER_CONNECTIONS NEW-LIMIT;
詳細については、MySQL ウェブサイトの「Setting Account Resource Limits」(アカウントリソース制限の設定) を参照してください。
接続エラー制限を確認する
次の手順を実行します。
-
Amazon RDS for MySQL の現在の max_connect_errors を確認するには、次のクエリを実行します。
SHOW VARIABLES LIKE 'max_connect_errors'; -
現在ブロックされているホストがあるかどうかを確認するには、次のクエリを実行します。
SELECT * FROM performance_schema.host_cache WHERE SUM_CONNECT_ERRORS > 0; -
ホストの現在の接続エラー数を確認するには、次のクエリを実行します。
SELECT HOST, SUM_CONNECT_ERRORS, COUNT_HANDSHAKE_ERRORS, COUNT_AUTHENTICATION_ERRORS FROM performance_schema.host_cache WHERE HOST = 'YOUR-CLIENT-IP';注: YOUR-CLIENT-IP をクライアント IP アドレスに置き換えてください。
-
ホストキャッシュをフラッシュしてすべてのホストのブロックを解除するには、次のクエリを実行します。
FLUSH HOSTS; -
将来的なブロックを防ぐために max_connect_errors パラメータを増やすには、次の modify-db-parameter-group コマンドを実行します。
aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_connect_errors,ParameterValue=NEW-VALUE,ApplyMethod=immediate"注: PARAMETER-GROUP-NAME をパラメータグループ名に、NEW-VALUE をより高い制限値 (1000000 など) に置き換えてください。
-
パラメータの変更が適用されたことを確認するには、ステップ 1 のクエリをもう一度実行し、新しい値を確認します。
詳細については、「How do I resolve the "Host is blocked because of many connections errors" error in Amazon RDS for MySQL?」(Amazon RDS for MySQL の "Host is blocked because of many connections errors" というエラーを解決する方法を教えてください) を参照してください。
関連情報
SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化
Amazon VPC のパブリックまたはプライベートサブネットを使用する Amazon RDS DB インスタンスに接続する方法を教えてください

