はじめに
通常、接続の問題は次の 3 つの領域のいずれかに分類されます。
- 接続 - ネットワーク経由でご自身のインスタンスにアクセスできますか?
- 認可 - インスタンスへの接続を認可されていますか?
- 認証 - データベースはご自身のデータベースの認証情報を受け入れていますか?
調査では、それぞれの領域がさらに細かく別の項目にわかれます。次のセクションでは、問題をさらに絞り込むために自問できる質問の例を示します。
接続の問題のチェックリスト
- 接続
- プライベート IP
- プロジェクトで
Service Networking API
を有効にしましたか? - 共有 VPC を使用していますか?
- ユーザーやサービス アカウントに、プライベート サービス アクセス接続の管理に必要な IAM 権限が付与されていますか?
- プロジェクトにプライベート サービス アクセス接続が構成されていますか?
- プライベート接続に IP アドレス範囲を割り振りましたか?
- 割り当てられた IP アドレス範囲に、sqlserver インスタンスを作成する予定のすべてのリージョンに少なくとも /24 のスペースが含まれていますか?
- sqlserver インスタンスに割り当てられた IP アドレス範囲を指定している場合、その範囲には、この範囲で sqlserver インスタンスを作成する予定のすべてのリージョンに少なくとも /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 証明書
- サーバー証明書は引き続き有効ですか?
- 承認済みネットワーク
- 送信元 IP アドレスが含まれていますか?
- RFC 1918 以外の IP アドレスを使用していますか?
- サポートされていない IP アドレスを使用していますか?
- 接続エラー
- 認証
- ネイティブ データベース認証(ユーザー名 / パスワード)
access denied
のエラーが表示されますか?- ユーザー名とパスワードは合っていますか?
エラー メッセージ
特定の API エラー メッセージについては、エラー メッセージのリファレンス ページをご覧ください。
その他の接続に関するトラブルシューティング
その他の問題については、トラブルシューティング ページの接続のセクションをご覧ください。
接続に関する一般的な問題
アプリケーションが実行中であることを確認する
「Aborted connection nnnn to db:
」というエラーが表示された場合は、通常、アプリケーションの接続が正しく終了されていないことを示します。ネットワークの問題もこのエラーの原因になる可能性があります。このエラーは、Cloud SQL インスタンスに問題があることを意味するものではありません。また、tcpdump
を実行してパケットを調べ、問題の原因を突き止めることをおすすめします。
接続を管理する際のおすすめの方法の例については、データベース接続の管理をご覧ください。
証明書が期限切れではないことを確認する
SSL を使用するようにインスタンスを構成している場合は、Google Cloud コンソールで Cloud SQL インスタンス ページに移動して、インスタンスを開きます。[接続] ページを開き、[セキュリティ] タブを選択して、サーバー証明書が有効であることを確認します。期限切れの場合は、新しい証明書を追加してローテーションする必要があります。
接続を許可されていることを確認する
接続が失敗する場合は、接続を許可されていることを確認します。
- IP アドレスを使用した接続に問題がある場合(たとえば、sqlcmd クライアントを使用してオンプレミス環境から接続している場合など)、接続元の 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 アドレスです。
接続の開始状態を確認する
データベースに接続して次のコマンドを実行すると、現在の接続に関する情報を確認できます。
sp_who go
接続に 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 の接続制限を超える可能性を少なくするには、常に適切な接続管理方法を採用してください。詳細については、データベース接続の管理をご覧ください。
接続数とスレッド数を表示する
データベース上で実行されているプロセスを確認するには、データベースに接続して、次のコマンドを実行します。sp_who go
sp_who
から返される列の解釈方法については、SQL Server のリファレンスをご覧ください。
接続タイムアウト(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
接続をデバッグするツール
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 インスタンスでテストを行うには、こちらの手順を行ってください。
接続をテストする
sqlcmd クライアントを使用して、ローカル環境から接続できるかどうかをテストできます。詳細については、IP アドレスを使用して sqlcmd クライアントを接続すると Cloud SQL Auth Proxy を使用して sqlcmd クライアントを接続するをご覧ください。
アプリケーションの IP アドレスを確認する
アプリケーションを実行しているパソコンの IP アドレスから Cloud SQL インスタンスへのアクセスを承認できるようにするため、そのアドレスを確認するには、次のいずれかのオプションを使用します。
- パソコンがプロキシやファイアウォールの背後にない場合は、パソコンにログインし、What is my IP? サイトを使用してIP アドレスを確認します。
- パソコンがプロキシやファイアウォールの背後にある場合は、パソコンにログインし、ツールや whatismyipaddress.com などのサービスを使用して実際の IP アドレスを確認します。
開いているローカルポート
ホストがリッスンしていると思われるポートを確認するには、ss -tunlp4
コマンドを実行します。これにより、開いているポートとリッスンされているポートがわかります。
すべてのローカルポート アクティビティ
すべてのローカルポート アクティビティを表示するには、netstat
コマンドを使用します。たとえば、netstat -lt
を使用すると、現在アクティブなポートがすべて表示されます。
telnet を使用して Cloud SQL インスタンスに接続する
TCP
を使用して Cloud SQL インスタンスに接続できることを確認するには、telnet
コマンドを実行します。Telnet は、指定された IP アドレスとポートに接続しようとします。
成功すると、次のように表示されます。
Trying 35.193.198.159...
Connected to 35.193.198.159.
失敗すると、試行を強制終了するまで telnet
がハングします。
Trying 35.193.198.159...
^C.
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 セクションまでスクロールし、インスタンスに適したログファイルを選択します。例:
- 重大度: ログレベルを選択します。
- 時間範囲: プリセットを選択するか、カスタム範囲を作成します。
gcloud
gcloud logging
コマンドを使用して、ログエントリを表示します。次の例では、PROJECT_ID
を置き換えます。
limit
フラグは、返されるエントリの最大数を示すオプションのパラメータです。
プライベート IP アドレス
プライベート IP アドレスを使用して Cloud SQL インスタンスへ接続すると、RFC 1918 アドレス範囲が自動的に承認されます。RFC 1918 以外のアドレス範囲は、Cloud SQL で認可済みネットワークとして構成される必要があります。また、RFC 1918 以外のルートをエクスポートするには、Cloud SQL へのネットワーク ピアリングを更新する必要もあります。次に例を示します。
gcloud compute networks peerings update cloudsql-sqlserver-googleapis-com
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID
VPN のトラブルシューティング
Cloud VPN のトラブルシューティングのページをご覧ください。