プライベート IP の構成

このページでは、プライベート IP を使用する Cloud SQL インスタンスを構成する方法について説明します。

プライベート IP の仕組み、および環境と管理に関する要件については、プライベート IP をご覧ください。

始める前に

API と IAM の要件

  • プロジェクトで Service Networking API を有効にする必要があります。
  • 共有 VPC ネットワークを使用している場合は、ホスト プロジェクトでもこの API を有効にする必要があります。

  • プライベート サービス アクセス接続を管理するため、ユーザーには次の IAM 権限が必要です。必要な権限がない場合は、権限不足のエラーが発生することがあります。
    • compute.networks.list
    • compute.addresses.create
    • compute.addresses.list
    • servicenetworking.services.addPeering

    また、共有 VPC ネットワークを使用している場合は、ユーザーをホスト プロジェクトに追加して、そのホスト プロジェクトのユーザーに同じ権限を割り当てる必要もあります。

プライベート サービス アクセス

プロジェクトで新しい VPC ネットワークを作成する場合は、プライベート サービス アクセスを構成して IP アドレス範囲を割り振り、プライベート サービス接続を作成する必要があります。これにより、VPC ネットワーク内のリソースは Cloud SQL インスタンスに接続できます。コンソールには、この構成の設定に役立つウィザードが用意されています。

プライベート IP を使用するようにインスタンスを構成する

インスタンスの作成時に、プライベート IP を使用するように Cloud SQL インスタンスを構成できます。また、同じ構成を既存のインスタンスに行うこともできます。

新しいインスタンスにプライベート IP を構成する

インスタンスの作成時に Cloud SQL インスタンスがプライベート IP を使用するように構成するには:

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。

    [Cloud SQL インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。
  3. 作成ウィザードの [構成オプション] で、[接続] セクションを展開します。
  4. [プライベート IP] チェックボックスをオンにします。

    プルダウン リストに、プロジェクトで使用可能な VPC ネットワークが表示されます。プロジェクトが共有 VPC のサービス プロジェクトである場合、ホスト プロジェクトの VPC ネットワークも表示されます。

  5. 使用する VPC ネットワークを選択します。
  6. [プライベート サービス接続が必要] と表示された場合:

    1. [接続の設定] をクリックします。
    2. [IP 範囲の割り振り] で、次のいずれかのオプションを選択します。
      • 既存の IP 範囲を 1 つ以上選択するか、プルダウンから新しい IP 範囲を作成します。プルダウンには、以前に割り振られた範囲があればそれが含まれます。または、[新しい IP 範囲の割り振り] を選択して、新しい範囲と名前を入力することもできます。
      • ネットワークで自動的に割り振られた IP 範囲を使用します。
    3. [続行] をクリックします。
    4. [接続の作成] をクリックします。
    5. ステータスを確認し、ネットワーク VPN_NAME のプライベート サービス接続が正常に作成されたことを確認します。
  7. [保存] をクリックします。

gcloud

まだ行っていない場合は、次の手順で Cloud SQL にプライベート サービス アクセスを構成します。選択した VPC ネットワークの名前を --network パラメータを使用して指定し、Cloud SQL インスタンスを作成します。また、パブリック IP を無効にすることを示す --no-assign-ip フラグを使用します。--network パラメータの値の形式は projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME になります。PROJECT_ID は VPC ネットワークのプロジェクト ID です。VPC ネットワークが共有 VPC の場合、共有 VPC ホスト プロジェクトの ID になります。
gcloud --project=[PROJECT_ID] beta sql instances create [INSTANCE_ID]
       --network=[VPC_NETWORK_NAME]
       --no-assign-ip

既存のインスタンスにプライベート IP を構成する

プライベート IP を使用するように既存の Cloud SQL インスタンスを構成すると、インスタンスが再起動し、ダウンタイムが生じます。

プライベート IP を使用するように既存のインスタンスを構成するには:

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。
    [Cloud SQL インスタンス] ページに移動
  2. インスタンス名をクリックして [概要] ページを開きます。
  3. [接続] タブを選択します。
  4. [プライベート IP] チェックボックスをオンにします。

    プルダウン リストには、プロジェクトで使用可能なネットワークが表示されます。プロジェクトが共有 VPC のサービス プロジェクトである場合、ホスト プロジェクトの VPC ネットワークも表示されます。

  5. 使用する VPC ネットワークを選択します。
  6. [プライベート サービス接続が必要] と表示された場合:

    1. [接続の設定] をクリックします。
    2. [IP 範囲の割り振り] で、次のいずれかのオプションを選択します。
      • 既存の IP 範囲を 1 つ以上選択するか、プルダウンから新しい IP 範囲を作成します。プルダウンには、以前に割り振られた範囲があればそれが含まれます。または、[新しい IP 範囲の割り振り] を選択して、新しい範囲と名前を入力することもできます。
      • ネットワークで自動的に割り振られた IP 範囲を使用します。
    3. [続行] をクリックします。
    4. [接続の作成] をクリックします。
    5. ステータスを確認し、ネットワーク VPN_NAME のプライベート サービス接続が正常に作成されたことを確認します。
  7. [保存] をクリックします。

gcloud

まだ行っていない場合は、次の手順で Cloud SQL にプライベート サービス アクセスを構成します。--network パラメータを使用して、選択した VPC ネットワークの名前を指定し、Cloud SQL インスタンスを更新します。

VPC_NETWORK_NAME は、選択した VPC ネットワークの名前(my-vpc-network など)です。--network パラメータの値の形式は https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/global/networks/[VPC_NETWORK_NAME] になります。

gcloud --project=[PROJECT_ID] beta sql instances patch [INSTANCE_ID]
       --network=[VPC_NETWORK_NAME]
       --no-assign-ip

プライベート IP を使用してインスタンスに接続する

プライベート サービス アクセスを使用して、同じ VPC ネットワーク内の Compute Engine または Google Kubernetes Engine(ここでは内部ソース)から、またはネットワーク外(外部ソース)から Cloud SQL インスタンスに接続します。

内部ソースから接続する

Compute Engine リソースで動作している Cloud SQL Auth Proxy など、Cloud SQL インスタンスと同じ Google Cloud プロジェクトのソースから接続するには、そのリソースが Cloud SQL インスタンスと同じ VPC ネットワークに存在している必要があります。

App Engine スタンダード環境App Engine フレキシブル環境Cloud Run、または Cloud Functions などのサーバーレス ソースから接続する場合は、アプリケーションまたは関数は、Cloud SQL Auth Proxy を使用せずにサーバーレス VPC アクセスを介してインスタンスに直接接続します。

外部ソースから接続する

外部ネットワークが Cloud SQL インスタンスが接続されている VPC ネットワークに接続されていれば、外部ネットワーク(オンプレミス ネットワークまたは VPC ネットワーク)内のクライアントから接続できます。外部ネットワークからの接続を許可するには、次の操作を行います。

  1. VPC ネットワークが外部ネットワークに、Cloud VPN トンネルまたは Dedicated Interconnect / Partner Interconnect 用 VLAN アタッチメントを使用して接続されていることを確認します。
  2. Cloud VPN トンネルと Cloud Interconnect アタッチメント(VLAN)を管理する Cloud Router の BGP セッションが、オンプレミス ネットワークから特定の接頭辞(宛先)を受信したことを確認します。デフォルト ルート(宛先 0.0.0.0/0)は、Cloud SQL VPC ネットワークにインポートできません。ネットワークに独自のローカルのデフォルト ルートがあるためです。Cloud SQL ピアリングが VPC ネットワークからカスタムルートをインポートするように構成されていても、宛先のローカルルートが常に使用されます。
  3. プライベート サービス接続によって生成されるピアリング接続を特定します
    • cloudsql-mysql-googleapis-com
    • cloudsql-postgres-googleapis-com
    • servicenetworking-googleapis-com
  4. すべてのピアリング接続を更新して、カスタムルートのエクスポートを有効にします。
  5. プライベート サービス接続に使用される割り振り範囲を特定します。
  6. Cloud VPN トンネルまたは Cloud Interconnect アタッチメント(VLAN)の BGP セッションを管理する Cloud Router の割り振り範囲用に Cloud Router のカスタムルート アドバタイズを作成します。

Cloud Shell から接続する

Cloud Shell は現在、プライベート IP アドレスのみを持つ Cloud SQL インスタンスへの接続をサポートしていません。

RFC 1918 以外のアドレスから接続する

RFC 1918 により、内部で(つまり、組織内で)使用するために割り当てられる IP アドレスが指定され、インターネット上ではルーティングされません。具体的には次のようなものがあります。

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

プライベート IP アドレスを使用して Cloud SQL インスタンスへ接続すると、RFC 1918 アドレス範囲が自動的に承認されます。これにより、すべてのプライベート クライアントがプロキシを経由せずにデータベースにアクセスできます。

RFC 1918 以外のアドレス範囲(RFC 1918 アドレス空間に含まれないアドレス)は、承認済みネットワークとして構成される必要があります。

RFC 1918 以外のアドレスから接続するには、インスタンスごとの IP 認可を設定して、RFC 1918 以外のアドレス範囲からのトラフィックを許可します。

たとえば、次のような gcloud コマンドを使用します。

gcloud sql instances patch INSTANCE_NAME --authorized-networks 192.88.99.0/24,11.0.0.0/24

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
  • cloudsql-mysql-googleapis-com は、VPC ネットワーク ページのプライベート サービス接続名です。

    ネットワークを選択し、[プライベート サービス接続] を探します。

  • NETWORK は VPC ネットワークの名前です。

トラブルシューティング

表内のリンクをクリックすると、詳細が表示されます。

この問題については... 次のような問題が考えられます... 次のことを試します...
Aborted connection パケットの読み取りエラー、または接続が中断された。 次の方法をお試しくださいをご覧ください。
Unauthorized to connect エラー。 多くの根本原因が考えられます。 次の方法をお試しくださいをご覧ください。
ネットワークの関連付けに失敗した。 プロジェクトで Service Networking API が有効になっていません。 プロジェクトで Service Networking API を有効にします
Remaining connection slots are reserved 最大接続数に達しました。 max_connections フラグの値を大きくします
Set Service Networking service account as servicenetworking.serviceAgent role on consumer project サービス ネットワーキングのサービス アカウントが servicenetworking.serviceAgent ロールにバインドされていません。 サービス ネットワーキングのサービス アカウントを servicenetworking.serviceAgent ロールにバインドします
error x509: certificate is not valid for any names, but wanted to match project-name:db-name 既知の問題: 現時点では、Cloud SQL Proxy Dialer は Go 1.15 と互換性がありません。 修正されるまで、回避策が記載されている GitHub のディスカッションをご覧ください。
一部のオペレーティング システムで証明書を解析できない。 macOS 11.0(Big Sur)の x509 ライブラリを使用しているクライアントは、mysql インスタンスの一部の証明書を解析できない場合があります。「cancelled」などの一般的なエラーとしてクライアントに表示される場合があります。 この問題を回避する方法は、サーバー証明書をローテーションして、クライアント証明書を再作成することです。
Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection 割り振り範囲を変更または削除した後に VPC ピアリングが更新されませんでした。 VPC ピアリングの更新の詳細については、次の方法をお試しくださいをご覧ください。
Allocated IP range not found in network 割り振り範囲を変更または削除した後に VPC ピアリングが更新されませんでした。 VPC ピアリングの更新の詳細については、次の方法をお試しくださいをご覧ください。
ERROR: (gcloud.sql.connect) It seems your client does not have ipv6 connectivity and the database instance does not have an ipv4 address. Please request an ipv4 address for this database instance. Cloud Shell を使用してプライベート IP インスタンスに接続しようとしています。 現時点では、Cloud Shell からプライベート IP アドレスのみを持つインスタンスへの接続はサポートされていません。

接続が中断された

エラー メッセージ Got an error reading communication packets または Aborted connection xxx to db: DB_NAME が表示されます。

次のような問題が考えられます

  • ネットワークが不安定です。
  • TCP keep-alive コマンドに応答しません(クライアントまたはサーバーのいずれかが応答しないか、過負荷の可能性があります)。
  • データベース エンジン接続の存続期間を超過し、サーバーが接続を終了しています。

次の方法をお試しください

アプリケーションはネットワーク障害に対応し、接続プールや再試行などのベスト プラクティスに沿っている必要があります。通常、可能な場合は、接続プーラーによりこれらのエラーが検出されます。エラーが検出されない場合、アプリケーションは、再試行を行うか安全に失敗する必要があります。

接続の再試行には、次の方法をおすすめします。

  1. 指数バックオフ。再試行の間隔を指数関数的に増やします。
  2. ランダム化されたバックオフも追加します。
これらの方法を組み合わせると、スロットリングが減ります。


接続失敗

エラー メッセージ Unauthorized to connect が表示されます。

次のような問題が考えられます

承認はさまざまなレベルで行われるため、多くの原因が考えられます。

  • データベース レベルでは、データベース ユーザーが存在し、パスワードが一致する必要があります。
  • プロジェクト レベルでは、ユーザーに適切な IAM 権限がない可能性があります。
  • Cloud SQL レベルでは、根本原因はインスタンスへの接続方法によって異なります。パブリック IP を介してインスタンスに直接接続する場合、接続のソース IP がインスタンスの承認済みネットワーク内に存在している必要があります。

    デフォルトでは、RFC 1918 以外のアドレスから接続する場合を除き、プライベート IP 接続が許可されています。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
    

    Cloud SQL Auth Proxy を介して接続する場合は、IAM 権限が正しく設定されていることを確認してください。

  • ネットワーク レベルでは、Cloud SQL インスタンスでパブリック IP を使用している場合、接続のソース IP が承認済みネットワーク内に存在している必要があります。

次の方法をお試しください

  • ユーザー名とパスワードを確認します。
  • ユーザーの IAM のロールと権限を確認します。
  • パブリック IP を使用する場合は、ソースが承認済みネットワーク内に存在していることを確認します。

ネットワークの関連付けに失敗した

エラー メッセージ Error: Network association failed due to the following error が表示されます。サービス ネットワーキングのサービス アカウントをユーザープロジェクトの servicenetworking.serviceAgent ロールとして設定します。

次のような問題が考えられます

プロジェクトで Service Networking API が有効になっていません。

次の方法をお試しください

プロジェクトで Service Networking API を有効にします。Cloud SQL インスタンスにプライベート IP アドレスの割り当てを試行中で、共有 VPC を使用しているときにこのエラーが表示される場合は、ホスト プロジェクトに対して Service Networking API を有効にする必要もあります。


残りの接続スロットが予約済み

エラー メッセージ FATAL: remaining connection slots are reserved for non-replication superuser connections が表示されます。

次のような問題が考えられます

最大接続数に達しました。

次の方法をお試しください

max_connections フラグの値を編集します。


サービス ネットワーキングのサービス アカウントをユーザー プロジェクトの servicenetworking.serviceAgent ロールとして設定する

エラー メッセージ set Service Networking service account as servicenetworking.serviceAgent role on consumer project. が表示されます。

次のような問題が考えられます

サービス ネットワーキングのサービス アカウントが、servicenetworking.serviceAgent ロールにバインドされていません。

次の方法をお試しください

この問題を回避するには、次の gcloud コマンドを使用して、サービス ネットワーキングのサービス アカウントを servicenetworking.serviceAgent ロールにバインドしてください。

gcloud beta services identity create --service=servicenetworking.googleapis.com --project=PROJECT_ID
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:service-PROJECT_NUMBER@service-networking.iam.gserviceaccount.com" --role="roles/servicenetworking.serviceAgent"

エラー x509: いずれの名前に対しても証明書が無効です

エラー メッセージ error x509: certificate is not valid for any names, but wanted to match project-name:db-name が表示されます。

次のような問題が考えられます...

既知の問題: 現時点では、Cloud SQL Proxy Dialer は Go 1.15 と互換性がありません。

次の方法をお試しください

バグが修正されるまで、回避策が記載されている GitHub のディスカッションをご覧ください。


一部のオペレーティング システムで証明書を解析できない

macOS 11.0(Big Sur)の x509 ライブラリを使用すると、mysql インスタンスの証明書の解析に失敗する場合があります。「cancelled」などの一般的なエラーとして表示される場合があります。

次の方法をお試しください

バグは修正されました。新しいインスタンスでこの問題が発生することはありません。古いインスタンスでこの問題が発生した場合は、サーバー証明書をローテーションして、クライアント証明書を再作成します。


CreateConnection で割り振り範囲を変更することはできません。UpdateConnection を使用してください

エラー メッセージ Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection または The operation "operations/1234" resulted in a failure "Allocated IP range 'xyz' not found in network が表示されます。

次のような問題が考えられます...

別の予約範囲を使用して再接続を試みると、最初のエラーが発生します。

割り振り範囲が変更されても、vpc-peerings が更新されなかった場合は、2 番目のエラーが表示されます。

次の方法をお試しください

プライベート接続を変更する必要があります。次のコマンドを使用します。--force 引数を必ず使用してください。

gcloud services vpc-peerings update --network=VPC_NETWORK --ranges=ALLOCATED_RANGES --service=servicenetworking.googleapis.com --force

次のステップ