プライベート 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 コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. [インスタンスを作成] をクリックします。
  3. [構成オプションを表示] を開きます。
  4. [接続] を開きます。
  5. [プライベート IP] を選択します。

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

  6. 使用する VPC ネットワークを選択します。
  7. プライベート サービス接続を設定する必要があることを示すメッセージが表示された場合は、次の手順を行います。

    1. [接続の設定] をクリックします。
    2. [IP 範囲を割り振る] セクションで、次のいずれかのオプションを選択します。
      • 既存の IP 範囲を 1 つ以上選択するか、プルダウンから新しい IP 範囲を作成します。プルダウンには、以前に割り振られた範囲があればそれが含まれます。または、[新しい IP 範囲を割り当てる] を選択して、新しい範囲と名前を入力することもできます。
      • ネットワークで自動的に割り振られた IP 範囲を使用します
    3. [続行] をクリックします。
    4. [接続の作成] をクリックします。
    5. Private service connection for network VPN_NAME has been successfully created」というメッセージが表示されることを確認します。
  8. 必要に応じて、接続に使用するインスタンスに割り振る IP 範囲を指定できます。
    1. [割り振られた IP 範囲のオプションを表示] を開きます。
    2. プルダウン メニューから IP 範囲を選択します。
  9. インスタンスの構成を終了します。
  10. [インスタンスを作成] をクリックします。

gcloud

プロジェクトがプライベート サービス アクセス用に構成されていることを確認してください。

選択した 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 になります。

必要に応じて、--allocated-ip-range-name パラメータを使用してプライベート アドレス範囲の名前を指定します。指定すると、割り振り範囲名が設定され、プライマリ インスタンスに対してプライベート アドレス範囲が作成されます。例: google-managed-services-default範囲名は RFC-1035 に準拠し、1~63 文字にする必要があります。(gcloud alpha sql instances create

VPC ネットワークが共有 VPC の場合は、次の gcloud コマンドで、PROJECT_ID を共有 VPC サービス プロジェクトの ID にしてください。

gcloud beta sql instances create INSTANCE_ID \
--project=PROJECT_ID \
--network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME \
--no-assign-ip \
--allocated-ip-range-name=RANGE_NAME

Terraform

新しいインスタンスにプライベート IP を構成するには、次の Terraform リソースを使用します。


resource "google_compute_network" "private_network" {
  name                    = "private-network"
  auto_create_subnetworks = "false"
}

resource "google_compute_global_address" "private_ip_address" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.private_network.id
}

resource "google_service_networking_connection" "private_vpc_connection" {
  network                 = google_compute_network.private_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

resource "google_sql_database_instance" "instance" {
  name             = "private-ip-sql-instance"
  region           = "us-central1"
  database_version = "MYSQL_8_0"

  depends_on = [google_service_networking_connection.private_vpc_connection]

  settings {
    tier = "db-f1-micro"
    ip_configuration {
      ipv4_enabled    = "false"
      private_network = google_compute_network.private_network.id
    }
  }
  deletion_protection = "false"
}

REST v1

プライベート IP アドレスを持つ新しいインスタンスを作成します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID
  • vpc-name: インスタンスに使用する VPC ネットワークの名前
  • allocated-ip-range: 省略可。指定すると、IP 範囲が割り当てられる範囲名が設定されます。範囲名は RFC-1035 を遵守し、1~63 文字にする必要があります。

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances

JSON 本文のリクエスト:

{
  "name": "instance-id",
  "region": "region",
  "databaseVersion": "database-version",
  "settings": {
    "tier": "machine-type",
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": "projects/project-id/global/networks/vpc-name",
      "allocatedIpRange": "allocated-ip-range"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

プライベート IP アドレスを持つ新しいインスタンスを作成します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID
  • vpc-name: インスタンスに使用する VPC ネットワークの名前
  • allocated-ip-range: 省略可。指定すると、IP 範囲が割り当てられる範囲名が設定されます。範囲名は RFC-1035 を遵守し、1~63 文字にする必要があります。

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1beta4/projects/project-id/instances

JSON 本文のリクエスト:

{
  "name": "instance-id",
  "region": "region",
  "databaseVersion": "database-version",
  "settings": {
    "tier": "machine-type",
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": "projects/project-id/global/networks/vpc-name",
      "allocatedIpRange": "allocated-ip-range"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

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

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

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

Console

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

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [接続] を選択します。
  4. [プライベート IP] チェックボックスをオンにします。

    プルダウン リストには、プロジェクトで使用可能なネットワークが表示されます。

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

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

gcloud

プロジェクトがプライベート サービス アクセス用に構成されていることを確認してください。

--network パラメータを使用して、選択した VPC ネットワークの名前を指定し、Cloud SQL インスタンスを更新します。

gcloud beta sql instances patch INSTANCE_ID \
--project=PROJECT_ID \
--network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME \
--no-assign-ip

REST v1

プライベート IP アドレスを持つ新しいインスタンスを作成します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID
  • vpc-name: インスタンスに使用する VPC ネットワークの名前
  • allocated-ip-range: 省略可。指定すると、IP 範囲が割り当てられる範囲名が設定されます。範囲名は RFC-1035 を遵守し、1~63 文字にする必要があります。

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

JSON 本文のリクエスト:

{
  "settings":
  {
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": "vpc-name",
      "allocatedIpRange": "allocated-ip-range"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

プライベート IP アドレスを持つ新しいインスタンスを作成します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID
  • vpc-name: インスタンスに使用する VPC ネットワークの名前
  • allocated-ip-range: 省略可。指定すると、IP 範囲が割り当てられる範囲名が設定されます。範囲名は RFC-1035 を遵守し、1~63 文字にする必要があります。

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

JSON 本文のリクエスト:

{
  "settings":
  {
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": "vpc-name",
      "allocatedIpRange": "allocated-ip-range"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

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

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

内部ソースから接続する

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

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. プライベート サービス接続によって生成されるピアリング接続を特定します。サービスに応じて、プライベート サービス接続が 1 つ以上の次のピアリング接続を作成する場合がありますが、必ずしもこれらがすべてではありません。
    • 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 PEERING_CONNECTION \
--network=NETWORK \
--export-subnet-routes-with-public-ip \
--project=PROJECT_ID
  • PEERING_CONNECTION は VPC ネットワークとサービス プロデューサー ネットワーク間のプライベート サービス接続によって生成されるピアリング接続の名前です。
  • NETWORK は VPC ネットワークの名前です。
  • PROJECT_ID は VPC ネットワークのプロジェクトの ID です。共有 VPC を使用している場合は、ホスト プロジェクト ID を使用します。

トラブルシューティング

接続の既知の問題についてはトラブルシューティングを、自己診断については接続の問題のデバッグをご覧ください。

次のステップ