配置专用 IP

本页面介绍如何将 Cloud SQL 实例配置为使用专用 IP。

如需了解专用 IP 的工作原理以及环境和管理要求,请参阅专用 IP

准备工作

API 和 IAM 要求

  • 您必须为 Google Cloud 项目启用 Service Networking API
  • 如果您使用的是共享 VPC 网络,还需要为宿主项目启用此 API。

  • 为了管理专用服务访问通道连接,用户必须拥有以下 Identity and Access Management (IAM) 权限。如果您没有所需的权限,则可能会出现权限不足错误。
    • compute.networks.list
    • compute.addresses.create
    • compute.addresses.list
    • servicenetworking.services.addPeering

    如果您使用的是共享 VPC 网络,则还需要将用户添加到宿主项目,并在宿主项目上将相同权限分配给用户。

专用服务访问通道

在项目中创建新的 Virtual Private Cloud (VPC) 网络时,您需要配置专用服务访问通道以分配 IP 地址范围并创建专用服务连接。这使 VPC 网络中的资源能够连接到 Cloud SQL 实例。Google Cloud 控制台提供了一个向导,可帮助您设置此配置。

将实例配置为使用专用 IP

您可以在创建 Cloud SQL 实例时将实例配置为使用专用 IP,或对现有实例如此配置。

为新实例配置专用 IP

如需在创建 Cloud SQL 实例时将该实例配置为使用专用 IP,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击创建实例
  3. 展开显示配置选项
  4. 展开连接
  5. 选择专用 IP

    下拉列表显示了项目中的可用 VPC 网络。如果项目是共享 VPC 的服务项目,则还会显示宿主项目中的 VPC 网络。

  6. 选择您要使用的 VPC 网络。
  7. 如果您看到一条消息,提示您需要设置专用服务连接,请执行以下操作:

    1. 点击设置连接
    2. 分配 IP 范围部分中,选择以下选项之一:
      • 从下拉列表中选择一个或多个现有的 IP 地址范围,或者创建一个新的 IP 地址范围。下拉列表包含先前分配的范围(若有),或者您可以选择分配新 IP 范围,然后输入新范围和名称。
      • 在网络中使用自动分配的 IP 地址范围
    3. 点击继续
    4. 点击创建连接
    5. 验证您是否看到以下消息:Private service connection for network VPC_NETWORK_NAME has been successfully created
  8. (可选)您可以为实例指定分配的 IP 地址范围以用于连接。
    1. 展开显示分配的 IP 范围选项
    2. 从下拉菜单中选择一个 IP 地址范围。
  9. 可选。如果您要允许其他 Google Cloud 服务(例如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接对此数据进行查询,请选择启用专用路径
  10. 完成实例配置。
  11. 点击创建实例

gcloud

在使用专用 IP 地址创建实例之前,请确保您的项目已针对专用服务访问通道进行了配置。

在使用任何请求数据之前,请先进行以下替换:

  • INSTANCE_ID:实例 ID
  • PROJECT_ID:项目 ID
  • NETWORK_PROJECT_ID:VPC 网络的项目 ID

  • VPC_NETWORK_NAME:VPC 网络的名称
  • RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合 RFC-1035 并且包含 1-63 个字符。
  • REGION_NAME:区域名称
如需指定 VPC 网络的名称,请使用 --network 参数。如需停用公共 IP 地址,请使用 --no-assign-ip 标志。

此外,您可以选择使用 --enable-google-private-path 参数允许其他 Google Cloud 服务(如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接针对此数据进行查询。此参数仅在以下情况下有效:

  • 使用 --no-assign-ip 参数。
  • 使用 --network 参数指定要用于创建专用连接的 VPC 网络的名称。

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

Terraform

如需为新实例配置专用 IP,请使用以下 Terraform 资源:


resource "google_compute_network" "peering_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.peering_network.id
}

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.peering_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.default]

  settings {
    tier = "db-f1-micro"
    ip_configuration {
      ipv4_enabled    = "false"
      private_network = google_compute_network.peering_network.id
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

resource "google_compute_network_peering_routes_config" "peering_routes" {
  peering              = google_service_networking_connection.default.peering
  network              = google_compute_network.peering_network.name
  import_custom_routes = true
  export_custom_routes = true
}

## Uncomment this block after adding a valid DNS suffix

# resource "google_service_networking_peered_dns_domain" "default" {
#   name       = "example-com"
#   network    = google_compute_network.peering_network.name
#   dns_suffix = "example.com."
#   service    = "servicenetworking.googleapis.com"
# }

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    terraform destroy

REST v1

创建使用专用 IP 地址的新实例:

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • INSTANCE_ID:实例 ID
  • VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
  • RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合 RFC-1035 并且包含 1-63 个字符。
  • AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。

对于 ipv4Enabled 参数,如果您为实例使用公共 IP 地址,请将值设置为 true;如果实例具有专用 IP 地址,请将值设置为 false

如果您将 enablePrivatePathForGoogleCloudServices 参数设置为 true,则允许其他 Google Cloud 服务(例如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接对此数据进行查询。如果将此参数设置为 false,则其他 Google Cloud 服务无法通过专用 IP 连接访问 Cloud SQL 中的数据。

HTTP 方法和网址:

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_NETWORK_NAME",
      "allocatedIpRange": "RANGE_NAME"
      "authorizedNetworks": [AUTHORIZED_NETWORKS],

      "enablePrivatePathForGoogleCloudServices": true

    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

创建使用专用 IP 地址的新实例:

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • INSTANCE_ID:实例 ID
  • VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
  • RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合 RFC-1035 并且包含 1-63 个字符。
  • AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。

对于 ipv4Enabled 参数,如果您为实例使用公共 IP 地址,请将值设置为 true;如果实例具有专用 IP 地址,请将值设置为 false

如果您将 enablePrivatePathForGoogleCloudServices 参数设置为 true,则允许其他 Google Cloud 服务(例如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接对此数据进行查询。如果将此参数设置为 false,则其他 Google Cloud 服务无法通过专用 IP 连接访问 Cloud SQL 中的数据。

HTTP 方法和网址:

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_NETWORK_NAME",
      "allocatedIpRange": "RANGE_NAME"
      "authorizedNetworks": [AUTHORIZED_NETWORKS],

      "enablePrivatePathForGoogleCloudServices": true

    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

为现有实例配置专用 IP

如果将现有的 Cloud SQL 实例配置为使用专用 IP,则会导致该实例重启,进而造成停机。

要将现有实例配置为使用专用 IP,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 从 Cloud SQL 导航菜单中选择连接
  4. 网络标签页上,选中专用 IP 复选框。

    下拉列表会显示项目中可用的网络。

  5. 选择您要使用的 VPC 网络:
  6. 如果您看到必须提供专用服务连接

    1. 点击设置连接
    2. 分配 IP 范围部分,选择以下选项之一:
      • 从下拉列表中选择一个或多个现有的 IP 地址范围,或者创建一个新的 IP 地址范围。下拉列表包含先前分配的范围(若有),或者您可以选择分配新 IP 范围,然后输入新范围和名称。
      • 在网络中使用自动分配的 IP 地址范围。
    3. 点击继续
    4. 点击创建连接
    5. 确认您看到已成功为网络 VPC_NETWORK_NAME 创建专用服务连接状态。
  7. 可选。如果您要允许其他 Google Cloud 服务(例如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接对此数据进行查询,请选中启用专用路径复选框。
  8. 点击保存

gcloud

确保已为您的项目配置专用服务访问通道

通过使用 --network 参数指定所选 VPC 网络的名称来更新 Cloud SQL 实例。

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

REST v1

创建使用专用 IP 地址的新实例:

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • INSTANCE_ID:实例 ID
  • VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
  • RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合 RFC-1035 并且包含 1-63 个字符。
  • AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。

对于 ipv4Enabled 参数,如果您为实例使用公共 IP 地址,请将值设置为 true;如果实例具有专用 IP 地址,请将值设置为 false

如果您将 enablePrivatePathForGoogleCloudServices 参数设置为 true,则允许其他 Google Cloud 服务(例如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接对此数据进行查询。如果将此参数设置为 false,则其他 Google Cloud 服务无法通过专用 IP 连接访问 Cloud SQL 中的数据。

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_ID

请求 JSON 正文:

{
  "settings":
  {
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": "projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME",
      "allocatedIpRange": "RANGE_NAME"
      "authorizedNetworks": [AUTHORIZED_NETWORKS],

      "enablePrivatePathForGoogleCloudServices": true

    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

创建使用专用 IP 地址的新实例:

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • INSTANCE_ID:实例 ID
  • VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
  • RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合 RFC-1035 并且包含 1-63 个字符。
  • AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。

对于 ipv4Enabled 参数,如果您为实例使用公共 IP 地址,请将值设置为 true;如果实例具有专用 IP 地址,请将值设置为 false

如果您将 enablePrivatePathForGoogleCloudServices 参数设置为 true,则允许其他 Google Cloud 服务(例如 BigQuery)访问 Cloud SQL 中的数据,并通过专用 IP 连接对此数据进行查询。如果将此参数设置为 false,则其他 Google Cloud 服务无法通过专用 IP 连接访问 Cloud SQL 中的数据。

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID

请求 JSON 正文:

{
  "settings":
  {
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": "projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME",
      "allocatedIpRange": "RANGE_NAME"
      "authorizedNetworks": [AUTHORIZED_NETWORKS],

      "enablePrivatePathForGoogleCloudServices": true

    }
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

使用实例的专用 IP 连接到实例

您可以使用专用服务访问通道从同一 VPC 子网(此处定义为内部来源)中的 Compute Engine 或 Google Kubernetes Engine 实例或从该网络外部(外部来源)连接到 Cloud SQL 实例。

从内部来源连接

如需从 Cloud SQL 实例所在的 Google Cloud 项目中的来源(例如 Compute Engine 资源上运行的 Cloud SQL Auth 代理)进行连接,该资源必须位于已为 Cloud SQL 实例建立专用服务访问通道的同一 VPC 网络中。

如需从无服务器源(例如 App Engine 标准环境Cloud RunCloud Functions 进行连接,您的应用或函数将通过无服务器 VPC 访问通道直接连接到您的实例,而无需使用 Cloud SQL Auth 代理。

从外部来源连接

如果外部网络(例如本地网络或 VPC 网络)连接到 Cloud SQL 实例所连接的 VPC 网络,您可以使用 Cloud VPNCloud Interconnect 从外部网络中的客户端连接到该实例。

如需允许从外部网络进行连接,请执行以下操作:

  1. 确保您的 VPC 网络已使用 Cloud VPN 隧道或者用于专用互连合作伙伴互连的 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 自定义路由通告

从云端 Shell 连接

Cloud Shell 不支持连接到仅具有专用 IP 地址的 Cloud SQL 实例。

从非 RFC 1918 IP 地址连接

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 IP 地址进行连接,您必须设置每个实例的 IP 授权,以允许来自非 RFC 1918 IP 地址范围的流量。

例如,按照以下方式使用 gcloud 命令:

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

默认情况下,Cloud SQL 不会从 VPC 网络获知非 RFC 1918 子网路由。您需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。

gcloud compute networks peerings update PEERING_CONNECTION \
--network=VPC_NETWORK_NAME \
--export-subnet-routes-with-public-ip \
--project=PROJECT_ID

    请替换以下内容:

  • PEERING_CONNECTION 是 VPC 网络与服务提供方网络之间的专用服务连接生成的对等互连连接的名称
  • VPC_NETWORK_NAME 为 VPC 网络的名称。
  • PROJECT_ID 是 VPC 网络的项目的 ID。 如果您使用的是共享 VPC,请使用宿主项目 ID。

如需缓解 IP 地址耗尽的情况,您可以使用以非公开方式使用的公共 IP 地址

从以非公开方式使用的公共 IP 地址连接

如果您要在以非公开方式使用的公共 IP 地址范围中配置实例,请在您的网络与 Cloud SQL 网络之间的网络对等互连上启用 export-subnet-routes-with-public-ip

gcloud compute networks peerings update PEERING_CONNECTION \
--network=VPC_NETWORK_NAME \
--export-subnet-routes-with-public-ip \
--project=PROJECT_ID

    请替换以下内容:

  • PEERING_CONNECTION 是 VPC 网络与服务提供方网络之间的专用服务连接生成的对等互连连接的名称。如需知道对等互连连接的名称,请进入 VPC 网络对等互连页面。
  • VPC_NETWORK_NAME 为 VPC 网络的名称。
  • PROJECT_ID 是 VPC 网络的项目的 ID。如果您使用的是共享 VPC,请使用宿主项目 ID。

连接到配置了以非公开方式使用的公共 IP 地址的实例

如果在以非公开方式使用的公共 IP 地址范围中配置了实例并且您希望连接到该实例,请在您的网络与 Cloud SQL 网络之间的网络对等互连上启用 import-subnet-routes-with-public-ip

gcloud compute networks peerings update PEERING_CONNECTION \
--network=VPC_NETWORK_NAME \
--import-subnet-routes-with-public-ip \
--project=PROJECT_ID

    请替换以下内容:

  • PEERING_CONNECTION 是 VPC 网络与服务提供方网络之间的专用服务连接生成的对等互连连接的名称。如需知道对等互连连接的名称,请进入 VPC 网络对等互连页面。
  • VPC_NETWORK_NAME 为 VPC 网络的名称。
  • PROJECT_ID 是 VPC 网络的项目的 ID。如果您使用的是共享 VPC,请使用宿主项目 ID。

问题排查

请参阅问题排查以了解已知的连接问题,并参阅调试连接问题以获取自助诊断方面的帮助。

后续步骤