接続の問題のデバッグ

はじめに

通常、接続の問題は次の 3 つの領域のいずれかに分類されます。

  • 接続 - ネットワーク経由でご自身のインスタンスにアクセスできますか?
  • 認可 - インスタンスへの接続を認可されていますか?
  • 認証 - データベースはご自身のデータベースの認証情報を受け入れていますか?

調査では、それぞれの領域がさらに細かく別の項目にわかれます。次のセクションでは、問題をさらに絞り込むために自問できる質問の例を示します。

接続の問題のチェックリスト

エラー メッセージ

特定の API エラー メッセージについては、エラー メッセージのリファレンス ページをご覧ください。

その他の接続に関するトラブルシューティング

その他の問題については、トラブルシューティング ページの接続のセクションをご覧ください。

接続に関する一般的な問題

アプリケーションが実行中であることを確認する

Aborted connection nnnn to db:」というエラーが表示された場合は、通常、アプリケーションの接続が正しく終了されていないことを示します。ネットワークの問題もこのエラーの原因になる可能性があります。このエラーは、Cloud SQL インスタンスに問題があることを意味するものではありません。また、tcpdump を実行してパケットを調べ、問題の原因を突き止めることをおすすめします。

接続を管理する際のおすすめの方法の例については、データベース接続の管理をご覧ください。

証明書が期限切れではないことを確認する

SSL を使用するようにインスタンスを構成している場合は、Cloud Console で 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

接続をデバッグするツール

最も基本的なツールは pingtraceroute です。

Ping

Ping は、宛先(Cloud SQL インスタンス)が送信元から使用可能かどうかを判断する基本的なテストを行います。Ping は、ICMP Echo Request パケットを Cloud SQL インスタンスに送信し、ICMP Echo Reply が返ってくることを期待します。ping が正常に通らない場合、送信元から宛先へのルートはありません。ただし、成功した場合でも、パケットが宛先に到達できたという意味ではなく、一般的には、単に Cloud SQL インスタンスに到達できるというだけです。

ping によってホストが稼働中で応答することは確認できますが、信頼性は保証されません。一部のネットワーク プロバイダでは、セキュリティ保護のため ICMP をブロックしているため、接続のデバッグは難しい場合があります。

traceroute

Traceroute は、あるホストから別のホストへのネットワーク パケットの完全なルートをテストします。パケットが通過するすべてのステップ(「ホップ」)と、各ステップでの所要時間が表示されます。パケットが宛先まで到達できない場合、traceroute は完了せず、後ろには連続したアスタリスクが続きます。この場合、途中で正常に到達した最後の IP アドレスを確認します。ここが接続の途切れた場所になります。

Traceroute は、タイムアウトする場合があります。また、経路中のゲートウェイがパケットをネクストホップに渡すように正しく構成されておらず、完了しない場合もあります。

traceroute が完了しなかった場合、停止した場所を特定できる可能性があります。traceroute の出力に表示された最後の IP アドレスを見つけて、ブラウザで who owns [IP_ADDRESS] を検索します。結果にアドレスの所有者が表示されないこともありますが、試してみる価値はあります。

mtr

mtr ツールは traceroute の形式で、ローカル プロセスの top コマンドと同じように動作し続けて継続的に更新されます。

tcpdump

tcpdump は、パケットをキャプチャするツールです。接続の問題をデバッグする際、tcpdump を実行して、ホストと CloudSQL インスタンス間のパケットをキャプチャして検査することを強くおすすめします。

ローカル IP アドレスを確認する

ホストのローカル アドレスがわからない場合は、ip -br address show コマンドを実行します。Linux では、ネットワーク インターフェース、インターフェースのステータス、ローカル IP、MAC アドレスが表示されます。例: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64

あるいは、ipconfigifconfig を実行して、ネットワーク インターフェースのステータスを確認することもできます。

接続テストによるテスト

接続テストは、ネットワーク内のエンドポイント間の接続を確認できる診断ツールです。構成を分析し、場合によってはランタイム検証を行います。Cloud SQL がサポートされるようになりました。Cloud SQL インスタンスでテストを行うには、こちらの手順を行ってください。

接続をテストする

sqlcmd クライアントを使用して、ローカル環境から接続できるかどうかをテストできます。詳細については、IP アドレスを使用して sqlcmd クライアントを接続するCloud SQL Auth Proxy を使用して sqlcmd クライアントを接続するをご覧ください。

アプリケーションの IP アドレスを確認する

アプリケーションを実行しているパソコンの IP アドレスから Cloud SQL インスタンスへのアクセスを承認できるようにするため、そのパソコンの 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 インスタンスのログエントリのログを表示するには:

Console

  1. Google Cloud Console で、[Cloud Logging] ページに移動します。

    Cloud Logging に移動

  2. ページの上部で既存の Cloud SQL プロジェクトを選択します。
  3. クエリビルダーに以下のクエリを追加します。
    • リソース: [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

IP 範囲 172.17.0.0/16 は、Docker ブリッジ ネットワーク用に予約されています。この範囲内の IP アドレスで作成された Cloud SQL インスタンスはすべて到達不能になります。プライベート IP アドレスを使用して、この範囲内の IP アドレスから Cloud SQL インスタンスに接続することもできません。

VPN のトラブルシューティング

Cloud VPN のトラブルシューティングのページをご覧ください。