書き込みエンドポイントを使用してインスタンスに接続する

概要

このページでは、プライベート サービス アクセス(PSA)を使用して、Virtual Private Cloud(VPC)ネットワーク内のクライアントから Cloud SQL インスタンスに接続するために書き込みエンドポイントを使用する方法について説明します。

書き込みエンドポイントは、現在のプライマリ インスタンスの IP アドレスに自動的に解決されるグローバル ドメイン名サービス(DNS)名です。レプリカのフェイルオーバーまたはスイッチオーバー オペレーションの場合、この書き込みエンドポイントは着信接続を新しいプライマリ インスタンスに自動的にリダイレクトします。IP アドレスの代わりに、Cloud SQL インスタンスへの SQL 接続文字列で書き込みエンドポイントを使用できます。書き込みエンドポイントを使用すると、リージョンの停止復旧または障害復旧ドリルでレプリカのフェイルオーバーまたはスイッチオーバー オペレーションを実行するときに、アプリケーション接続を変更する必要がなくなります。

対象の各 Cloud SQL インスタンスには、Cloud SQL によって名前、作成、更新が管理される単一の組み込み書き込みエンドポイントがあります。次の例は、その形式を示しています。

  103uufa2svq8u.2rb3qdj9tkf4d.global.sql-psa.goog.
  

書き込みエンドポイントは常に .global.sql-psa.goog. 接尾辞で終わります。Cloud SQL によって管理されているこの書き込みエンドポイントの名前や形式は変更できません。

書き込みエンドポイントは、挿入、更新、削除、DDL 変更など、プライマリ インスタンスに対するすべての書き込みオペレーションに使用できます。クエリなどの読み取りオペレーションに書き込みエンドポイントを使用することもできます。レプリカ フェイルオーバーまたはスイッチオーバー オペレーションを実行してレプリカ インスタンスを新しいプライマリ インスタンスに昇格させると、書き込みエンドポイントが指すプライベート IP アドレスは Cloud SQL によって自動的に変更されます。

書き込みエンドポイントを生成する

新しい Cloud SQL インスタンスを作成する場合、次の前提条件が満たされると、Cloud SQL は書き込みエンドポイントを自動的に作成します。

  • Cloud SQL インスタンスが存在する Google Cloud プロジェクトで、次の API を有効にする必要があります。

    プロジェクトで Cloud DNS API を有効にしないと、ピアリング DNS ゾーンを作成できず、DNS 名を使用できなくなります。

    ピアリング DNS ゾーンが正常に作成されたら、変更しないことが重要です。削除を含む変更を行うと、DNS がデータベース接続に使用できなくなります。

  • Cloud SQL インスタンスは Cloud SQL Enterprise Plus エディションである必要があります。
  • プライベート サービス アクセス(PSA)が有効になっているプライベート IP を使用するように Cloud SQL インスタンスを構成する必要があります。
  • この機能を使用するには、新しいネットワーク アーキテクチャのインスタンスが必要です。ほとんどの場合、新しいインスタンスは新しいアーキテクチャで作成されます。これを確認するには、インスタンスのネットワーク アーキテクチャを確認します

既存の Cloud SQL Enterprise エディション インスタンスを Cloud SQL Enterprise Plus エディション インスタンスにアップグレードすると、前述の前提条件が満たされている場合、Cloud SQL は書き込みエンドポイントを自動的に生成します。既存のインスタンスが古いネットワーク アーキテクチャにある場合は、まずインスタンスを新しいネットワーク アーキテクチャにアップグレードして、書き込みエンドポイントを取得する必要があります。

書き込みエンドポイントのない Cloud SQL Enterprise Plus エディションのインスタンスがすでに存在し、Cloud SQL で書き込みエンドポイントを自動的に生成する場合は、高度な障害復旧が有効になっているレプリカを作成します。

書き込みエンドポイントを表示する

gcloud

書き込みエンドポイントを見つけるには、次の gcloud CLI コマンドを使用します。

      gcloud sql instances describe INSTANCE_NAME \
      | grep psaWriteEndpoint
    

次のように置き換えます。

INSTANCE_NAME: Cloud SQL インスタンスの名前。

書き込みエンドポイントは常に .global.sql-psa.goog. 接尾辞で終わります。次の例をご覧ください。

  103uufa2svq8u.2rb3qdj9tkf4d.global.sql-psa.goog.
  

対象インスタンスの書き込みエンドポイントが表示されない場合は、トラブルシューティングをご覧ください。

書き込みエンドポイントを使用して Cloud SQL インスタンスに接続する

psql

書き込みエンドポイントを使用して psql クライアントを Cloud SQL インスタンスに接続するには、次のコマンドを実行します。

    psql -U DATABASE_NAME -h WRITE_ENDPOINT
  

次のように置き換えます。

  • DATABASE_NAME: データベースの名前。 例: postgres
  • WRITE_ENDPOINT: DNS 名または書き込みエンドポイント。この英数字の値は常に .global.sql-psa.goog. 接尾辞で終わります。たとえば、103uufa2svq8u.2rb3qdj9tkf4d.global.sql-psa.goog. です。

SSL/TLS 接続を介して書き込みエンドポイントを使用してデータベース クライアントをデータベース インスタンスに接続する

psql

SSL/TLS 接続を介して書き込みエンドポイントを使用してデータベース クライアントをインスタンスに接続するには、次のコマンドを実行します。

  psql "sslmode=SSL_MODE \
    sslrootcert=SSL_ROOT_SERVER \
    sslcert=SSL_CERT \
    sslkey=SSL_KEY \
    host=WRITE_ENDPOINT \
    port=PORT user=USERNAME \
    dbname=DATABASE_NAME"
  

次のように置き換えます。

  • SSL_MODE: 使用される SSL モード。例: verify-full
  • SSL_ROOT_SERVER: SSL ルートサーバーの名前。例: server-ca.pem
  • SSL_CERT: クライアントで使用される SSL 証明書の名前。例: client-cert.pem
  • SSL_KEY: クライアントが使用する SSL 鍵の名前。例: client-key.pem
  • WRITE_ENDPOINT: DNS 名または書き込みエンドポイント。この英数字の値は常に .global.sql-psa.goog. 接尾辞で終わります。たとえば、103uufa2svq8u.2rb3qdj9tkf4d.global.sql-psa.goog. です。
  • PORT: 使用されるポート番号。例: 5432
  • USERNAME: ユーザー名。例: postgres
  • DATABASE_NAME: データベースの名前。 例: postgres

制限事項

  • 書き込みエンドポイントは、Cloud SQL Enterprise エディション インスタンスの作成には使用できません。
  • 書き込みエンドポイントは、パブリック IP のみのインスタンスまたは Private Service Connect のみのインスタンスでは使用できません。
  • 書き込みエンドポイントは、Cloud SQL Auth Proxy または言語コネクタで使用できません。

トラブルシューティング

以降のセクションでは、書き込みエンドポイントのアーキテクチャについて説明し、一般的なトラブルシューティングの問題に対処します。

書き込みエンドポイントのアーキテクチャ

対象インスタンスを作成すると、デフォルトで書き込みエンドポイントが生成されます。

書き込みエンドポイントを作成するために、Cloud SQL は次の設定を行います。

  • サービス Cloud SQL プロデューサー VPC ネットワークに限定公開 DNS ゾーンを作成します。
  • 顧客の VPC ネットワークにピアリング DNS ゾーンを作成します
  • サービス プロデューサー ネットワークのプライベート DNS ゾーンに DNS レコードを作成します

次の図は、このプロセスの仕組みを示しています。

VPC ピアリングがプロジェクト間の DNS ゾーン ピアリングをサポートする方法を示す図。
図 1. VPC ピアリングがサービス プロデューサー ネットワークとカスタマー ネットワーク間の DNS ゾーン ピアリングをサポートする方法を示す図。

DNS 解決に関する問題

DNS 解決が機能しない場合は、次の各項目を確認します。

  1. すべての前提条件が満たされていることを確認します。
  2. 解決が想定されるクライアントが、Cloud SQL インスタンスがアタッチされているネットワークと同じネットワークに配置されていることを確認します。これを確認するには、gcloud compute instances list コマンドを使用します。
    gcloud compute instances list \
       --format="table( name, zone.basename(), networkInterfaces[].network )" \
       --project=PROJECT_NAME

    PROJECT_NAME は、DNS コンシューマー ネットワークが存在するプロジェクトの名前に置き換えます。

  3. ピアリング ゾーンが存在することを確認します。これを行うには、gcloud dns managed-zones list コマンドを使用します。
    gcloud dns managed-zones list \
        --project=PROJECT_NAME

    PROJECT_NAME は、DNS コンシューマー ネットワークが存在するプロジェクトの名前に置き換えます。

  4. ピアリング ゾーンが存在しない場合は、gcloud beta sql instances patch コマンドを使用して問題を解決できます。
    gcloud beta sql instances patch INSTANCE_NAME --reconcile-psa-networking

    INSTANCE_NAME は、Cloud SQL インスタンスの名前に置き換えます。

新しいインスタンスに書き込みエンドポイントがない

新しく作成したインスタンスに書き込みエンドポイントが含まれていない場合は、次の各項目を確認します。

  1. すべての前提条件が満たされていることを確認します。
  2. DNS 名 sql-psa.goog. のピアリング DNS ゾーンが残っていないことを確認します。

    ピアリング DNS ゾーンに関連付けられたネットワークに、ピアリング DNS ゾーンのピア プロジェクト ID との VPC ピアリングがない場合、ピアリング DNS ゾーンは残りの DNS ゾーンになります。

    sql-psa.goog. 接尾辞が付いたピアリング DNS ゾーンが残っている場合は、削除します。

    ピアリング DNS ゾーンが残っていないか確認するには、gcloud dns managed-zones list コマンドを使用します。

    gcloud dns managed-zones list \
       --project=PROJECT_NAME

    PROJECT_NAME は、DNS コンシューマー ネットワークが存在するプロジェクトの名前に置き換えます。

    sql-psa.goog. 接尾辞を持つ DNS ゾーンが存在する場合は、ピアリング DNS ゾーンが残りの DNS ゾーンであることを再確認してから、DNS ゾーンを削除します。

    DNS ゾーンを削除するには、gcloud dns managed-zones delete コマンドを使用します。

    gcloud dns managed-zones delete ZONE_NAME

    ZONE_NAME は、書き込みエンドポイントに関連付けられている DNS ゾーンの名前に置き換えます。値は英数字で、cloud-sql-psa-dns-1234567890 の形式です。

  3. gcloud beta sql instances patch コマンドを使用すると、対象インスタンスの書き込みエンドポイントの欠落を修正できます。
    gcloud beta sql instances patch INSTANCE_NAME --reconcile-psa-networking

    INSTANCE_NAME は、Cloud SQL インスタンスの名前に置き換えます。

次のステップ