接続の問題のデバッグ

はじめに

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

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

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

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

エラー メッセージ

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

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

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

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

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

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

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

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

SSL を使用するようにインスタンスを構成している場合は、Cloud Console で Cloud SQL インスタンス ページに移動して、インスタンスを開きます。[接続] ページを開き、[セキュリティ] タブを選択して、サーバー証明書が有効であることを確認します。期限切れの場合は、新しい証明書を追加してローテーションする必要があります。

接続を許可されていることを確認する

接続が失敗する場合は、接続を許可されていることを確認します。

  • IP アドレスで接続できない場合(たとえば、PSQL クライアントを使用してオンプレミス環境から接続している場合)、接続元の 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-postgres-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
    
  • こちらが現在の IP アドレスです。

  • gcloud sql connect コマンドでインスタンスに接続してみます。このコマンドは現在の IP アドレスを短時間だけ認可します。このコマンドは、Cloud SDK と PSQL クライアントがインストールされている環境で実行できます。このコマンドは Cloud Shell でも実行できます。Google Cloud Console で使用できる Cloud Shell には、Cloud SDK と PSQL クライアントがプリインストールされています。Cloud Shell で提供される Compute Engine インスタンスを使用して、Cloud SQL に接続できます。
  • 0.0.0.0/0 を承認し、インスタンスに対するアクセスをすべての IP アドレスに一時的に許可します。

接続方法を確認する

接続時に次のようなエラー メッセージが表示される場合:

FATAL: database `user` does not exist.

gcloud sql connect --user コマンドは、デフォルト ユーザー(postgres)でのみ動作します。この問題を回避するには、デフォルト ユーザーを使用して接続し、"\c" psql コマンドを使用して別のユーザーとして再接続します。

接続の開始状態を確認する

データベースに接続して次のコマンドを実行すると、現在の接続に関する情報を確認できます。

SELECT * from pg_stat_activity ;

接続に 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 の接続制限を超える可能性を少なくするには、常に適切な接続管理方法を採用してください。詳細については、データベース接続の管理をご覧ください。

接続数とスレッド数を表示する

データベース上で実行されているプロセスを確認するには、pg_stat_activity テーブルを使用します。

select * from pg_stat_activity;

接続タイムアウト(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 を実行して、ホストと 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 インスタンスでテストを行うには、こちらの手順を行ってください。

接続をテストする

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

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

アプリケーションを実行しているパソコンの IP アドレスから Cloud SQL インスタンスへのアクセスを承認できるようにするため、そのパソコンの IP アドレスを確認するには、次のいずれかのオプションを使用します。

  • パソコンがプロキシやファイアウォールの背後にない場合は、パソコンにログインし、What is my IP? サイトを使用してIP アドレスを確認します。
  • パソコンがプロキシやファイアウォールの背後にある場合は、パソコンにログインし、ツールや whatismyipaddress.com などのサービスを使用して実際の IP アドレスを確認します。

開いているローカルポート

ホストがリッスンしていると思われるポートを確認するには、ss -tunlp4 コマンドを実行します。これにより、開いているポートとリッスンされているポートがわかります。たとえば、動作している PostgreSQL データベースがある場合は、ポート 5432 が開いており、リッスンしています。SSH の場合は、ポート 22 が表示されます。

すべてのローカルポート アクティビティ

すべてのローカルポート アクティビティを表示するには、netstat コマンドを使用します。たとえば、netstat -lt を使用すると、現在アクティブなポートがすべて表示されます。

telnet を使用して Cloud SQL インスタンスに接続する

TCP を使用して Cloud SQL インスタンスに接続できることを確認するには、telnet コマンドを実行します。Telnet は、指定された IP アドレスとポートに接続しようとします。

たとえば、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 インスタンスのログエントリのログを表示するには:

Console

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

    Cloud Logging に移動

  2. ページの上部で既存の Cloud SQL プロジェクトを選択します。
  3. クエリビルダーに以下のクエリを追加します。
    • リソース: [Cloud SQL データベース] を選択します。ダイアログで、Cloud SQL インスタンスを選択します。
    • ログ名: Cloud SQL セクションまでスクロールし、インスタンスに適したログファイルを選択します。例:
      • cloudsql.googleapis.com/postgres.log
    • 重大度: ログレベルを選択します。
    • 時間範囲: プリセットを選択するか、カスタム範囲を作成します。

gcloud

gcloud logging コマンドを使用して、ログエントリを表示します。次の例では、PROJECT_ID を置き換えます。 limit フラグは、返されるエントリの最大数を示すオプションのパラメータです。

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-postgres-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 のトラブルシューティングのページをご覧ください。