はじめに
通常、接続の問題は次の 3 つの領域のいずれかに分類されます。
- 接続 - ネットワーク経由でご自身のインスタンスにアクセスできますか?
- 認可 - インスタンスへの接続を認可されていますか?
- 認証 - データベースはご自身のデータベースの認証情報を受け入れていますか?
調査では、それぞれの領域がさらに細かく別の項目にわかれます。次のセクションでは、問題をさらに絞り込むために自問できる質問の例を示します。
接続の問題のチェックリスト
- 接続
- プライベート IP
- プロジェクトで
Service Networking API
を有効にしましたか? - 共有 VPC を使用していますか?
- ユーザーやサービス アカウントに、限定公開サービス アクセス接続の管理に必要な IAM 権限が付与されていますか?
- プロジェクトにプライベート サービス アクセス接続が構成されていますか?
- プライベート接続に IP アドレス範囲を割り振りましたか?
- 割り振られた IP アドレス範囲に、MySQL インスタンスを作成する予定のすべてのリージョンに少なくとも /24 のスペースが含まれていますか?
- MySQL インスタンスに割り振られた IP アドレス範囲を指定している場合、その範囲には、この範囲で MySQL インスタンスを作成する予定のすべてのリージョンに少なくとも /24 のスペースが含まれていますか?
- プライベート接続が作成されていますか?
- プライベート接続が変更されている場合、vpc-peerings は更新されていますか?
- VPC ログにエラーが含まれていますか?
- ソースマシンの IP は、RFC 1918 以外のアドレスですか?
- パブリック IP
- 送信元 IP が認証済みネットワークとして表示されていますか?
- SSL / TLS 証明書は必須ですか?
- ユーザー アカウントやサービス アカウントに、Cloud SQL インスタンスへの接続に必要な IAM 権限が付与されていますか?
- 認可
- Cloud SQL Auth Proxy
- Cloud SQL Auth Proxy は最新ですか?
- Cloud SQL Auth Proxy は動作中ですか?
- インスタンスの接続名は、Cloud SQL Auth Proxy 接続コマンドで正しい形式に設定されていますか?
- Cloud SQL Auth Proxy の出力を確認しましたか?出力をファイルに保存するか、Cloud SQL Auth Proxy を起動した Cloud Shell ターミナルを確認してください。
- ユーザー アカウントやサービス アカウントに、Cloud SQL インスタンスへの接続に必要な IAM 権限が付与されていますか?
- プロジェクトで
Cloud SQL Admin API
を有効にしましたか? - アウトバウンド ファイアウォール ポリシーがある場合は、ターゲット Cloud SQL インスタンス上のポート 3307 への接続が許可されていることを確認してください。
- UNIX ドメイン ソケットを使用して接続している場合は、Cloud SQL Auth Proxy の起動時に -dir で指定されたディレクトリを一覧表示して、ソケットが作成されていることを確認します。
- Cloud SQL コネクタと言語固有コード
- 接続文字列は正しい形式ですか?
- 作成したコードと、使用しているプログラミング言語のサンプルコードを比較しましたか?
- サンプルコードのないランタイムまたはフレームワークを使用していますか?
- 使用している場合、コミュニティで関連する参照資料を確認しましたか?
- セルフマネージド SSL / TLS 証明書
- クライアント証明書が送信元のパソコンにインストールされていますか?
- 接続引数のクライアント証明書のスペルは合っていますか?
- クライアント証明書は引き続き有効ですか?
- SSL で接続するときにエラーが発生しますか?
- サーバー証明書は引き続き有効ですか?
- 承認済みネットワーク
- 送信元 IP アドレスが含まれていますか?
- RFC 1918 以外の IP アドレスを使用していますか?
- サポートされていない IP アドレスを使用していますか?
- 接続エラー
- 認証
- ネイティブ データベース認証(ユーザー名 / パスワード)
access denied
のエラーが表示されますか?- ユーザー名とパスワードは合っていますか?
- IAM データベース認証
- インスタンスで
cloudsql.iam_authentication
フラグを有効にしましたか? - アカウントのポリシー バインディングを追加しましたか?
- データベース パスワードとして
-enable_iam_login
または Oauth 2.0 トークンを持つ Cloud SQL Auth Proxy を使用していますか? - サービス アカウントを使用している場合は、短縮されたメール名を使用していますか?
- 詳細については、PostgreSQL での IAM データベース認証を確認してください。
エラー メッセージ
特定の API エラー メッセージについては、エラー メッセージのリファレンス ページをご覧ください。
その他の接続に関するトラブルシューティング
その他の問題については、トラブルシューティング ページの接続のセクションをご覧ください。
接続に関する一般的な問題
アプリケーションが実行中であることを確認する
「Aborted connection nnnn to db:
」というエラーが表示された場合は、通常、アプリケーションの接続が正しく終了されていないことを示します。ネットワークの問題もこのエラーの原因になる可能性があります。このエラーは、Cloud SQL インスタンスに問題があることを意味するものではありません。また、tcpdump
を実行してパケットを調べ、問題の原因を突き止めることをおすすめします。
接続を管理する際のおすすめの方法の例については、データベース接続の管理をご覧ください。
証明書が期限切れではないことを確認する
SSL を使用するようにインスタンスを構成している場合は、Google Cloud コンソールで Cloud SQL インスタンス ページに移動して、インスタンスを開きます。[接続] ページを開き、[セキュリティ] タブを選択して、サーバー証明書が有効であることを確認します。期限切れの場合は、新しい証明書を追加してローテーションする必要があります。
接続を許可されていることを確認する
接続が失敗する場合は、接続を許可されていることを確認します。
- IP アドレスで接続できない場合(たとえば、MySQL クライアントを使用してオンプレミス環境から接続している場合)、接続元の IP アドレスに Cloud SQL インスタンスへの接続が承認されていることを確認します。
プライベート IP アドレスを使用して Cloud SQL インスタンスへ接続すると、RFC 1918 アドレス範囲が自動的に承認されます。これにより、すべてのプライベート クライアントは、Cloud SQL Auth Proxy を経由せずにデータベースにアクセスできます。RFC 1918 以外のアドレス範囲は、承認済みネットワークとして構成する必要があります。
Cloud SQL は、デフォルトでは VPC から RFC 1918 以外のサブネット ルートを学習しません。RFC 1918 以外のルートをエクスポートするには、Cloud SQL へのネットワーク ピアリングを更新する必要があります。次に例を示します。
gcloud compute networks peerings update cloudsql-mysql-googleapis-com \ --network=NETWORK \ --export-subnet-routes-with-public-ip \ --project=PROJECT_ID
こちらが現在の IP アドレスです。
gcloud sql connect
コマンドでインスタンスに接続してみます。このコマンドは現在の IP アドレスを短時間だけ認可します。このコマンドは、gcloud CLI と mysql クライアントがインストールされている環境で実行できます。このコマンドは Cloud Shell でも実行できます。Google Cloud コンソールで使用できる Cloud Shell には、gcloud CLI と MySQL クライアントがプリインストールされています。Cloud Shell で提供される Compute Engine インスタンスを使用して、Cloud SQL に接続できます。- 一時的に、すべての IP アドレスにインスタンスへの接続を許可します。IPv4 の場合は、
0.0.0.0/0
を認可します(IPv6 の場合は::/0
を認可します)。
接続方法を確認する
接続時に次のようなエラー メッセージが表示される場合:ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)
パスワードを提供していることを確認します。
接続時に次のようなエラー メッセージが表示される場合:
ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)
正しいパスワードを使用していること、およびインスタンスで要求されている場合は SSL で接続していることを確認します。
接続の開始状態を確認する
データベースに接続して次のコマンドを実行すると、現在の接続に関する情報を確認できます。
SHOW PROCESSLIST;
接続に 1.2.3.4
のような IP アドレスが示されている場合、その接続では IP が使用されています。cloudsqlproxy~1.2.3.4
を持つ接続は、Cloud SQL Auth Proxy を使用しているか、App Engine が送信元の接続です。localhost
からの接続は、一部の内部 Cloud SQL プロセスで使用できます。
接続制限
Cloud SQL インスタンスに QPS の制限はありません。ただし、接続数やサイズの制限および App Engine 固有の制限はあります。割り当てと上限をご覧ください。
データベース接続は、サーバーと接続元アプリケーションのリソースを消費します。アプリケーションのフットプリントを最小限に抑え、Cloud SQL の接続制限を超える可能性を少なくするには、常に適切な接続管理方法を採用してください。詳細については、データベース接続の管理をご覧ください。
接続数とスレッド数を表示する
「接続が多すぎる」というエラー メッセージが表示される場合、またはインスタンスで起きていることを確認する必要がある場合は、SHOW PROCESSLIST
を使用して接続数とスレッド数を表示できます。
MySQL クライアントから、次のように実行します。
mysql> SHOW PROCESSLIST;
出力は次のようになります。
+----+-----------+--------------+-----------+---------+------+-------+----------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------+--------------+-----------+---------+------+-------+----------------------+ | 3 | user-name | client-IP | NULL | Query | 0 | NULL | SHOW processlist | | 5 | user-name | client-IP | guestbook | Sleep | 1 | | SELECT * from titles | | 17 | user-name | client-IP | employees | Query | 0 | NULL | SHOW processlist | +----+-----------+--------------+-----------+---------+------+-------+----------------------+ 3 rows in set (0.09 sec)
PROCESSLIST
から返される列の解釈方法については、MySQL リファレンスをご覧ください。
スレッド数を取得するには、次のコマンドを使用します。
mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';
出力は次のようになります。
+-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 7 | +-------------------+-------+ 1 row in set (0.08 sec)
接続タイムアウト(Compute Engine)
Compute Engine インスタンスとの接続は、アクティブでない状態で 10 分経過するとタイムアウトします。これは、Compute Engine インスタンスと Cloud SQL インスタンスの間の長期間使用されない接続に影響します。詳細については、Compute Engine のドキュメントのネットワークとファイアウォールをご覧ください。
長時間使用されない接続がタイムアウトしないようにするには、TCP keep-alive を設定できます。次のコマンドは TCP keep-alive の値を 1 分に設定し、インスタンスが再起動しても構成が変わらないようにします。
現在の tcp_keepalive_time の値を表示します。
cat /proc/sys/net/ipv4/tcp_keepalive_time
tcp_keepalive_time を 60 秒に設定し、再起動しても変わらないようにします。
echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf
変更を適用します。
sudo /sbin/sysctl --load=/etc/sysctl.conf
tcp_keepalive_time の値を表示して、変更が適用されたことを確認します。
cat /proc/sys/net/ipv4/tcp_keepalive_time
IPv6 で接続する
接続時に次のようなエラー メッセージが表示される場合があります。
Can't connect to MySQL server on '2001:1234::4321' (10051) Can't connect to MySQL server on '2001:1234::4321' (101)
このような場合は、インスタンスの IPv6 アドレスに接続を試みているのに、ワークステーションでは IPv6 を使用できない可能性があります。ワークステーションで IPv6 を使用できるかどうかを確認するには、ipv6.google.com にアクセスします。このサイトを読み込めない場合は、IPv6 を使用できません。この場合は IPv4 アドレスまたは Cloud SQL インスタンスに接続します。先に、IPv4 アドレスをインスタンスに追加することが必要な場合があります。
接続をデバッグするツール
tcpdump
tcpdump
は、パケットをキャプチャするツールです。接続の問題をデバッグする際、tcpdump
を実行して、ホストと Cloud SQL インスタンス間のパケットをキャプチャして検査することを強くおすすめします。
ローカル IP アドレスを確認する
ホストのローカル アドレスがわからない場合は、ip -br address show
コマンドを実行します。Linux では、ネットワーク インターフェース、インターフェースのステータス、ローカル IP、MAC アドレスが表示されます。例: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64
。
あるいは、ipconfig
や ifconfig
を実行して、ネットワーク インターフェースのステータスを確認することもできます。
接続テストでテストを行う
接続テストは、ネットワーク内のエンドポイント間の接続を確認できる診断ツールです。構成を分析し、場合によってはランタイム検証を行います。Cloud SQL がサポートされるようになりました。Cloud SQL インスタンスでテストを行うには、こちらの手順を行ってください。
接続をテストする
mysql クライアントを使用して、ローカル環境からの接続状況をテストできます。詳細については、IP アドレスを使用して mysql クライアントを接続すると Cloud SQL Auth Proxy を使用して mysql クライアントを接続するをご覧ください。
アプリケーションの IP アドレスを確認する
アプリケーションを実行しているパソコンの IP アドレスから Cloud SQL インスタンスへのアクセスを承認できるようにするため、そのアドレスを確認するには、次のいずれかのオプションを使用します。
- パソコンがプロキシやファイアウォールの背後にない場合は、パソコンにログインし、What is my IP? サイトを使用してIP アドレスを確認します。
- パソコンがプロキシやファイアウォールの背後にある場合は、パソコンにログインし、ツールや whatismyipaddress.com などのサービスを使用して実際の IP アドレスを確認します。
開いているローカルポート
ホストがリッスンしていると思われるポートを確認するには、ss -tunlp4
コマンドを実行します。これにより、開いているポートとリッスンしているポートがわかります。たとえば、動作している MySQL データベースがある場合は、ポート 3306 が開いており、リッスンしています。SSH の場合は、ポート 22 が表示されます。たとえば、動作している PostgreSQL データベースがある場合は、ポート 5432 が開いており、リッスンしています。SSH の場合は、ポート 22 が表示されます。
すべてのローカルポート アクティビティ
すべてのローカルポート アクティビティを表示するには、netstat
コマンドを使用します。たとえば、netstat -lt
を使用すると、現在アクティブなポートがすべて表示されます。
telnet を使用して Cloud SQL インスタンスに接続する
TCP
を使用して Cloud SQL インスタンスに接続できることを確認するには、telnet
コマンドを実行します。Telnet は、指定された IP アドレスとポートに接続しようとします。
telnet 35.193.198.159 3306
と指定すると、ポート 3306 でインスタンスに telnet 接続できます。たとえば、Cloud SQL インスタンスで PostgreSQL データベースを実行している場合は、telnet 35.193.198.159 5432
と指定すると、ポート 5432 で telnet 接続できます。成功すると、次のように表示されます。
Trying 35.193.198.159...
Connected to 35.193.198.159.
失敗すると、試行を強制終了するまで telnet
がハングします。
Trying 35.193.198.159...
^C.
クライアント認証
クライアント認証は、pg_hba.conf
という名前の構成ファイルで制御されます(HBA はホストベースの認証を意味します)。
ソース データベース上の pg_hba.conf
ファイルのレプリケーション接続セクションを更新して、Cloud SQL VPC の IP アドレス範囲からの接続を受け入れるようにします。
Cloud Logging
Cloud SQL と Cloud SQL は、Cloud Logging を使用します。詳細については、Cloud logging のドキュメントをご覧ください。また、Cloud SQL のサンプルクエリもご覧ください。
ログを表示
Cloud SQL インスタンスと、Cloud VPN や Compute Engine インスタンスなどのその他の Google Cloud プロジェクトのログを表示できます。Cloud SQL インスタンスのログエントリのログを表示するには:
コンソール
-
Google Cloud コンソールで、[Cloud Logging] ページに移動します。
- ページの上部で既存の Cloud SQL プロジェクトを選択します。
- クエリビルダーに以下のクエリを追加します。
- リソース: [Cloud SQL データベース] を選択します。ダイアログで、Cloud SQL インスタンスを選択します。
- ログ名: Cloud SQL セクションまでスクロールし、インスタンスに適したログファイルを選択します。例:
- cloudsql.googlapis.com/mysql-general.log
- cloudsql.googleapis.com/mysql.err
- cloudsql.googleapis.com/postgres.log
- 重大度: ログレベルを選択します。
- 時間範囲: プリセットを選択するか、カスタム範囲を作成します。
gcloud
gcloud logging
コマンドを使用して、ログエントリを表示します。次の例では、PROJECT_ID
を置き換えます。
limit
フラグは、返されるエントリの最大数を示すオプションのパラメータです。
gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/mysql-general.log" \ --limit=10
gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/postgres.log" \ --limit=10
プライベート IP アドレス
プライベート IP アドレスを使用して Cloud SQL インスタンスへ接続すると、RFC 1918 アドレス範囲が自動的に承認されます。RFC 1918 以外のアドレス範囲は、Cloud SQL で認可済みネットワークとして構成される必要があります。また、RFC 1918 以外のルートをエクスポートするには、Cloud SQL へのネットワーク ピアリングを更新する必要もあります。次に例を示します。
gcloud compute networks peerings update cloudsql-mysql-googleapis-com
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID
VPN のトラブルシューティング
Cloud VPN のトラブルシューティングのページをご覧ください。