使用 Private Service Connect 连接到实例

本页面介绍了如何使用 Private Service Connect 连接到 Cloud SQL 实例。

您可以使用 Private Service Connect 从属于不同组、团队、项目或组织的多个 Virtual Private Cloud (VPC) 网络连接到 Cloud SQL 主实例或其任何读取副本

准备工作

gcloud CLI 416.0.0 版及更高版本支持将 Private Service Connect 与 Cloud SQL 实例搭配使用。

用户角色

下表介绍了将 Private Service Connect 与 Cloud SQL 实例搭配使用所需的角色:

角色 说明
compute.networkAdmin

授予对 VPC 网络的完整控制权限来启动与 Cloud SQL 实例的连接。您可以创建和管理 IP 地址、防火墙规则和 Private Service Connect 端点

如果您使用 Private Service Connect 从多个 VPC 网络连接到 Cloud SQL 实例,则每个网络都有自己的管理员。

dns.admin 授予对 Cloud DNS 资源的完全控制权,包括 DNS 区域和记录
cloudsql.admin 可以完全控制 Cloud SQL 实例,并控制实例的整个生命周期。
cloudsql.instanceUser 提供对 Cloud SQL 实例的访问权限。如果您通过 Cloud SQL Auth 代理客户端进行连接,则必须具有 Cloud SQL Client 角色。如果您直接连接,则不需要任何 Identity and Access Management (IAM) 角色和权限

创建 Cloud SQL 实例

您可以使用 gcloud CLI、Terraform 或 API 创建实例并为其启用 Private Service Connect。

gcloud

如需创建实例并为其启用 Private Service Connect,请使用 gcloud sql instances create 命令:

gcloud sql instances create INSTANCE_NAME \
--project=PROJECT_ID \
--region=REGION_NAME \
--enable-private-service-connect \
--allowed-psc-projects=ALLOWED_PROJECTS \
--availability-type=AVAILABILITY_TYPE \
--no-assign-ip \
--database-version=DATABASE_VERSION
--cpu=NUMBER_OF_vCPUs \
--memory=MEMORY_SIZE \
--root-password=ROOT_PASSWORD

进行以下替换:

  • INSTANCE_NAME:实例的名称。
  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
  • REGION_NAME:实例的区域名称。
  • ALLOWED_PROJECTS:允许的项目 ID 或编号列表(以英文逗号分隔)。如果某个项目未包含在此列表中,您无法使用它来创建实例并为其启用 Private Service Connect。

  • AVAILABILITY_TYPE:为实例启用高可用性。对于此参数,请指定以下值之一:
    • REGIONAL:启用高可用性,建议用于生产实例。实例会故障切换到所选区域内的另一个可用区。
    • ZONAL:不提供故障切换功能。此设置为默认值。

    如需详细了解如何为实例设置和移除高可用性,请参阅为现有实例配置高可用性为实例停用高可用性

  • DATABASE_VERSION:实例的数据库版本(例如 SQLSERVER_2019_STANDARD)。
  • NUMBER_OF_vCPUs:实例的核心数。
  • MEMORY_SIZE:实例的内存量。
  • ROOT_PASSWORDroot Cloud SQL 用户的密码。

Terraform

如需创建启用 Private Service Connect 的实例,请使用 google_sql_database_instanceTerraform 资源

resource "google_sql_database_instance" "default" {
  name             = "sqlserver-instance"
  region           = "us-central1"
  database_version = "SQLSERVER_2019_ENTERPRISE"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier              = "db-custom-2-7680"
    availability_type = "REGIONAL"
    backup_configuration {
      enabled    = true
      start_time = "20:55"
    }
    ip_configuration {
      psc_config {
        psc_enabled               = true
        allowed_consumer_projects = [] # Add consumer project IDs here.
      }
      ipv4_enabled = false
    }
  }
  deletion_protection = false # Set to "true" to prevent destruction of the resource
}

如需在 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 已创建或更新它们。

REST

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

  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
  • INSTANCE_NAME:实例的名称。
  • REGION_NAME:实例的区域名称。
  • ROOT_PASSWORDroot Cloud SQL 用户的密码。
  • AVAILABILITY_TYPE:为实例启用高可用性。对于此参数,请指定以下值之一:
    • REGIONAL:启用高可用性,建议用于生产实例。实例会故障切换到所选区域内的另一个可用区。
    • ZONAL:不提供故障切换功能。此设置为默认值。

    如需详细了解如何为实例设置和移除高可用性,请参阅配置现有实例以实现高可用性为实例停用高可用性

  • ALLOWED_PROJECTS:允许的项目 ID 或编号列表(以英文逗号分隔)。如果某个项目未包含在此列表中,您无法使用它来创建实例并为其启用 Private Service Connect。

  • MACHINE_TYPE:枚举字符串值,表示实例的机器类型。例如:db-custom-NUMBER_OF_vCPUs-MEMORY_SIZE,其中 NUMBER_OF_vCPUsMEMORY_SIZE 是实例所需的核心数和内存量。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

请求 JSON 正文:

{
  "name": "INSTANCE_NAME",
  "project": PROJECT_ID",
  "region": "REGION_NAME",
  "databaseVersion": "SQLSERVER_2019_STANDARD",
  "rootPassword": "ROOT_PASSWORD",
  "kind": "sql#instance",
  "settings": {
    "availabilityType": "AVAILABILITY_TYPE",
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [
          "ALLOWED_PROJECTS"
        ],
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "SYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
  "status": "RUNNING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "startTime": "2023-06-14T18:48:35.499Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

获取服务连接

创建启用了 Private Service Connect 的 Cloud SQL 实例后,获取服务连接 URI 并使用它来创建 Private Service Connect 端点。

gcloud

如需查看启用了 Private Service Connect 的实例的摘要信息(例如 pscServiceAttachmentLink 字段,其显示指向实例的服务连接的 URI),请使用 gcloud sql instances describe 命令:

gcloud sql instances describe INSTANCE_NAME \
--project=PROJECT_ID

进行以下替换:

  • INSTANCE_NAME:VPC 网络中的 Private Service Connect 端点可以连接的 Cloud SQL 实例的名称
  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号

以下示例展示了此命令的示例输出:

gcloud sql instances describe myinstance \
--project=12345

...
pscServiceAttachmentLink: projects/45678/regions/myregion/serviceAttachments/myserviceattachment

Terraform

如需获取服务连接 URI,请使用 google_compute_addressTerraform 资源

resource "google_compute_address" "default" {
  name         = "psc-compute-address-${google_sql_database_instance.default.name}"
  region       = "us-central1"
  address_type = "INTERNAL"
  subnetwork   = "default"     # Replace value with the name of the subnet here.
  address      = "10.128.0.44" # Replace value with the IP address to reserve.
}

data "google_sql_database_instance" "default" {
  name = resource.google_sql_database_instance.default.name
}

resource "google_compute_forwarding_rule" "default" {
  name                  = "psc-forwarding-rule-${google_sql_database_instance.default.name}"
  region                = "us-central1"
  network               = "default"
  ip_address            = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target                = data.google_sql_database_instance.default.psc_service_attachment_link
}

如需在 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 已创建或更新它们。

REST

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

  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
  • INSTANCE_NAME:实例的名称

HTTP 方法和网址:

GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

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

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

{
  ...
  pscServiceAttachmentLink: "projects/PROJECT_ID/regions/REGION_NAME/serviceAttachments/SERVICE_ATTACHMENT_NAME"
}

pscServiceAttachmentLink 字段显示指向实例的服务连接的 URI。

创建 Private Service Connect 端点

您可以为 Private Service Connect 端点预留内部 IP 地址,并使用该地址创建端点。如需创建端点,您需要服务连接 URI 以及允许实例的项目。

gcloud

  1. 如需为 Private Service Connect 端点预留内部 IP 地址,请使用
    gcloud compute addresses create 命令:

    gcloud compute addresses create ADDRESS_NAME \
    --project=PROJECT_ID \
    --region=REGION_NAME \
    --subnet=SUBNET_NAME \
    --addresses=INTERNAL_IP_ADDRESS

    进行以下替换:

    • ADDRESS_NAME:内部 IP 地址的名称。
    • PROJECT_ID:端点的 Google Cloud 项目的 ID 或项目编号
    • REGION_NAME:端点的区域名称。
    • SUBNET_NAME:IP 地址的子网名称。
    • INTERNAL_IP_ADDRESS:要预留的 IP 地址。此 IP 地址必须在子网的主要 IP 地址范围内。 该 IP 地址可以是 RFC 1918 地址,也可以是具有非 RFC 范围的子网。
  2. 如需验证 IP 地址是否已预留,请使用 gcloud compute addresses list 命令:

    gcloud compute addresses list ADDRESS_NAME \
    --project=PROJECT_ID

    在响应中,验证 IP 地址是否显示为 RESERVED 状态。

  3. 如需创建 Private Service Connect 端点并将其指向 Cloud SQL 服务连接,请使用 gcloud compute forwarding-rules create 命令:

    gcloud compute forwarding-rules create ENDPOINT_NAME \
    --address=ADDRESS_NAME \
    --project=PROJECT_ID \
    --region=REGION_NAME \
    --network=NETWORK_NAME \
    --target-service-attachment=SERVICE_ATTACHMENT_URI \
    --allow-psc-global-access

    进行以下替换:

    • ENDPOINT_NAME:端点的名称
    • NETWORK_NAME:端点的 VPC 网络的名称
    • SERVICE_ATTACHMENT_URI:服务连接的 URI
  4. 如需验证服务连接是否接受端点,请使用
    gcloud compute forwarding-rules describe 命令:

    gcloud compute forwarding-rules describe ENDPOINT_NAME \
    --project=PROJECT_ID \
    --region=REGION_NAME

    在响应中,验证 pscConnectionStatus 字段是否显示 ACCEPTED 状态。端点可以连接到服务连接。

Terraform

如需创建 Private Service Connect 端点,请使用 google_sql_database_instance Terraform 资源

resource "google_compute_address" "default" {
  name         = "psc-compute-address-${google_sql_database_instance.default.name}"
  region       = "us-central1"
  address_type = "INTERNAL"
  subnetwork   = "default"     # Replace value with the name of the subnet here.
  address      = "10.128.0.44" # Replace value with the IP address to reserve.
}

data "google_sql_database_instance" "default" {
  name = resource.google_sql_database_instance.default.name
}

resource "google_compute_forwarding_rule" "default" {
  name                  = "psc-forwarding-rule-${google_sql_database_instance.default.name}"
  region                = "us-central1"
  network               = "default"
  ip_address            = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target                = data.google_sql_database_instance.default.psc_service_attachment_link
}

如需在 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 已创建或更新它们。

REST

  1. 为 Private Service Connect 端点预留内部 IP 地址。

  2. 验证 IP 地址是否已预留。

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

    • PROJECT_ID:包含 Private Service Connect 端点的 Google Cloud 项目的 ID 或项目编号
    • REGION_NAME:区域的名称
    • ADDRESS_NAME:IP 地址的名称

    HTTP 方法和网址:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/addresses/ADDRESS_NAME

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

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

    {
      "kind": "compute#address",
      "id": "ADDRESS_ID",
      "creationTimestamp": "2024-05-09T11:20:50.114-07:00",
      "name": "ADDRESS_NAME",
      "description": "This is the name of the internal IP address.",
      "address": "IP_ADDRESS",
      "status": "RESERVED",
      "region": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/addresses/ADDRESS_NAME",
      "networkTier": "PREMIUM",
      "labelFingerprint": "LABEL_FINGERPRINT_ID",
      "addressType": "EXTERNAL"
    }
    

    在响应中,验证 IP 地址是否显示为 RESERVED 状态。

  3. 创建 Private Service Connect 端点并将其指向 Cloud SQL 服务连接。

  4. 验证服务连接是否接受端点。

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

    • PROJECT_ID:包含 Private Service Connect 端点的 Google Cloud 项目的 ID 或项目编号
    • REGION_NAME:区域的名称
    • ENDPOINT_NAME:端点的名称

    HTTP 方法和网址:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/forwardingRules/ENDPOINT_NAME

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

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

    {
      "kind": "compute#forwardingRule",
      "id": "ENDPOINT_ID",
      "creationTimestamp": "2024-05-09T12:03:21.383-07:00",
      "name": "ENDPOINT_NAME",
      "region": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME",
      "IPAddress": "IP_ADDRESS",
      "target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/serviceAttachments/SERVICE_ATTACHMENT_NAME",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/forwardingRules/ENDPOINT_NAME",
      "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default",
      "serviceDirectoryRegistrations": [
        {
          "namespace": "goog-psc-default"
        }
      ],
      "networkTier": "PREMIUM",
      "labelFingerprint": "LABEL_FINGERPRINT_ID",
      "fingerprint": "FINGERPRINT_ID",
      "pscConnectionId": "CONNECTION_ID",
      "pscConnectionStatus": "ACCEPTED",
      "allowPscGlobalAccess": true
    }
    

    在响应中,验证 pscConnectionStatus 字段是否显示 ACCEPTED 状态。端点可以连接到服务连接。

连接到 Cloud SQL 实例

您可以使用内部 IP 地址、DNS 记录、Cloud SQL Auth 代理、Cloud SQL 语言连接器或其他 Google Cloud 应用连接到启用了 Private Service Connect 的 Cloud SQL 实例。

配置 DNS 代管式区域和 DNS 记录

Cloud SQL 不会自动创建 DNS 记录。但实例查找 API 响应会提供建议的 DNS 名称。我们建议您在相应 VPC 网络的专用 DNS 区域中创建 DNS 记录。这提供了一种使用 Cloud SQL Auth 代理从不同网络进行连接的一致方法。

gcloud

  1. 如需查看有关 Cloud SQL 实例的摘要信息(包括实例的 DNS 名称),请使用 gcloud sql instances describe 命令:

    gcloud sql instances describe INSTANCE_NAME \
    --project=PROJECT_ID

    进行以下替换:

    • INSTANCE_NAME:Cloud SQL 实例的名称
    • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号

    在响应中,验证是否显示 DNS 名称。此名称的格式如下:INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.。例如:1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.

  2. 如需创建专用 DNS 区域,请使用 gcloud dns managed-zones create 命令。此区域与用于通过 Private Service Connect 端点连接到 Cloud SQL 实例的 VPC 网络相关联。

    gcloud dns managed-zones create ZONE_NAME \
    --project=PROJECT_ID \
    --description=DESCRIPTION \
    --dns-name=DNS_NAME \
    --networks=NETWORK_NAME \
    --visibility=private

    进行以下替换:

    • ZONE_NAME:DNS 区域的名称
    • PROJECT_ID:包含区域的 Google Cloud 项目的 ID 或项目编号
    • DESCRIPTION:区域的说明(例如 Cloud SQL 实例的 DNS 区域)
    • DNS_NAME:区域的 DNS 后缀名称,例如 REGION_NAME.sql.goog.(其中 REGION_NAME 是区域的名称)
    • NETWORK_NAME:VPC 网络的名称
  3. 创建 Private Service Connect 端点后,如需在可用区中创建 DNS 记录,请使用 gcloud dns record-sets create 命令:

    gcloud dns record-sets create DNS_RECORD \
    --project=PROJECT_ID \
    --type=RRSET_TYPE \
    --rrdatas=RR_DATA \
    --zone=ZONE_NAME

    进行以下替换:

    • DNS_RECORD:DNS 记录的名称。此记录会设置为先前在此过程中从 Cloud SQL 实例检索到的 DNS 名称(例如 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)。
    • RRSET_TYPE:DNS 记录集的资源记录类型(例如 A)。
    • RR_DATA:为 Private Service Connect 端点分配的 IP 地址(例如 198.51.100.5)。您也可以输入多个值,例如 rrdata1 rrdata2 rrdata3(例如 10.1.2.3 10.2.3.4 10.3.4.5)。

REST

  1. 获取 Cloud SQL 实例的 DNS 名称。
  2. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
    • INSTANCE_NAME:实例的名称

    HTTP 方法和网址:

    GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

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

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

    {
      ...
      "dnsName": "INSTANCE_ID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog."
    }
    

    dnsName 字段显示 Cloud SQL 实例的 DNS 名称。DNS 名称始终以英文句点 (.) 结尾。

  3. 创建专用 DNS 区域。此区域与用于通过 Private Service Connect 端点连接到 Cloud SQL 实例的 VPC 网络相关联。
  4. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:包含 DNS 区域的 Google Cloud 项目的 ID 或项目编号
    • ZONE_NAME:区域的名称
    • DESCRIPTION:区域的说明(例如 Cloud SQL 实例的 DNS 区域)
    • DNS_NAME:区域的 DNS 后缀名称,例如 REGION_NAME.sql.goog.(其中 REGION_NAME 是区域的名称)
    • NETWORK_NAME:VPC 网络的名称

    HTTP 方法和网址:

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones

    请求 JSON 正文:

    {
      "name": "ZONE_NAME",
      "description": "DESCRIPTION",
      "dnsName": "DNS_NAME",
      "visibility": "private",
      "privateVisibilityConfig": {
        "kind": "dns#managedZonePrivateVisibilityConfig",
        "networks": [
          {
            "kind": "dns#managedZonePrivateVisibilityConfigNetwork",
            "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME"
          }
        ]
      }
    }
    

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

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

    {
      "name": "ZONE_NAME",
      "dnsName": "DNS_NAME",
      "description": "DESCRIPTION",
      "id": "ID",
      "nameServers": [
        "ns-gcp-private.googledomains.com."
      ],
      "creationTime": "2024-05-10T17:05:34.607Z",
      "visibility": "private",
      "privateVisibilityConfig": {
        "networks": [
          {
            "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME",
            "kind": "dns#managedZonePrivateVisibilityConfigNetwork"
          }
        ],
        "gkeClusters": [],
        "kind": "dns#managedZonePrivateVisibilityConfig"
      },
      "cloudLoggingConfig": {
        "kind": "dns#managedZoneCloudLoggingConfig"
      },
      "kind": "dns#managedZone"
    }
    
  5. 创建 Private Service Connect 端点后,在区域中创建 DNS 记录。
  6. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:包含 DNS 区域的 Google Cloud 项目的 ID 或项目编号
    • ZONE_NAME:区域的名称。
    • DNS_RECORD:DNS 记录的名称。此记录会设置为先前在此过程中从 Cloud SQL 实例检索到的 DNS 名称(例如 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)。
    • RRSET_TYPE:记录集的类型(例如 A)。
    • TTL:记录集的存留时间 (TTL),以秒为单位(例如 300)。
    • RR_DATA:为 Private Service Connect 端点分配的 IP 地址(例如 198.51.100.5)。您也可以输入多个值,例如 rrdata1 rrdata2 rrdata3(例如 10.1.2.3 10.2.3.4 10.3.4.5)。

    HTTP 方法和网址:

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ZONE_NAME

    请求 JSON 正文:

    {
      "deletions": []
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ]
        }
      ]
    }
    

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

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

    {
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ],
          "signatureRrdatas": [],
          "kind": "dns#resourceRecordSet"
        }
      ],
      "deletions": [],
      "startTime": "2024-05-10T17:29:44.375Z",
      "id": "CHANGE_ID",
      "status": "pending",
      "kind": "dns#change"
    }
    

使用 DNS 记录直接连接

在使用 DNS 记录连接到 Cloud SQL 实例之前,请完成以下操作:

  1. 创建 Private Service Connect 端点
  2. 确认实例的服务连接可接受端点。如需验证端点状态是否为 ACCEPTED,请检查状态
  3. 配置 DNS 托管式区域和 DNS 记录

满足这些条件后,请使用 DNS 记录从在其中创建了端点的任何 VPC 网络连接到实例。

sqlcmd -S DNS_RECORD -d DATABASE_NAME -U USERNAME

进行以下替换:

  • DNS_RECORD:端点的 DNS 记录
  • DATABASE_NAME:实例中包含的 Cloud SQL for SQL Server 数据库的名称
  • USERNAME:连接到实例的用户的名称

通过内部 IP 地址直接连接

在连接到启用了 Private Service Connect 的 Cloud SQL 实例之前,请完成以下操作:

  1. 创建 Private Service Connect 端点
  2. 确认实例的服务连接可接受端点。如需验证端点状态是否为 ACCEPTED,请检查状态

满足这些条件后,您可以使用端点的 IP 地址从在其中创建了端点的任何 VPC 网络访问实例。

  1. 检索 Private Service Connect 端点的内部 IP 地址。

    gcloud

    如需检索 IP 地址,请使用 gcloud compute addresses describe 命令:

    gcloud compute addresses describe ADDRESS_NAME \
    --project=PROJECT_ID \
    --region=REGION_NAME

    进行以下替换:

    • ADDRESS_NAME:端点的 IP 地址的名称
    • PROJECT_ID:包含端点的 Google Cloud 项目的 ID 或项目编号
    • REGION_NAME:端点的区域名称

    在响应中,验证 address 字段是否显示 IP 地址。这是内部 IP 地址。

    REST

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

    • PROJECT_ID:包含端点的 Google Cloud 项目的 ID 或项目编号
    • REGION_NAME:端点的区域名称
    • ADDRESS_NAME:端点的 IP 地址的名称

    HTTP 方法和网址:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/addresses/ADDRESS_NAME

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

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

    {
      "kind": "compute#address",
      "id": "ADDRESS_ID",
      "creationTimestamp": "2024-05-09T11:20:50.114-07:00",
      "name": "ADDRESS_NAME",
      "description": "This is the name of the internal IP address.",
      "address": "IP_ADDRESS",
      "status": "RESERVED",
      "region": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/addresses/ADDRESS_NAME",
      "networkTier": "PREMIUM",
      "labelFingerprint": "LABEL_FINGERPRINT_ID",
      "addressType": "EXTERNAL"
    }
    

    内部 IP 地址是与 address 字段关联的值。

  2. 如需连接到 Cloud SQL 实例,请使用内部 IP 地址。

    sqlcmd -S IP_ADDRESS -d DATABASE_NAME -U USERNAME

    进行以下替换:

    • IP_ADDRESS:端点的 IP 地址
    • DATABASE_NAME:实例中包含的 Cloud SQL for SQL Server 数据库的名称
    • USERNAME:连接到实例的用户的名称

使用 Cloud SQL Auth 代理连接

借助 Cloud SQL Auth 代理,您可以使用连接器安全访问启用了 Private Service Connect 的实例,而无需授权网络或配置 SSL。

为了允许使用 Cloud SQL Auth 代理客户端连接,请设置与为实例提供的建议 DNS 名称匹配的 DNS 记录。DNS 记录是 DNS 资源和域名之间的映射。

下载并安装 Cloud SQL Auth 代理

如需连接到启用了 Private Service Connect 的实例,您必须下载并安装 Cloud SQL Auth 代理的二进制文件。您下载的二进制文件取决于操作系统,以及该系统使用的是 32 位还是 64 位内核。大多数较新的硬件使用的是 64 位内核。

如果您不确定自己的机器运行的内核是 32 位还是 64 位,请使用 uname -a 命令(Linux 或 macOS)。对于 Windows,请参阅 Windows 文档

启动 Cloud SQL Auth 代理

Cloud SQL Auth 代理支持与启用了 Private Service Connect 的实例的连接。如需了解详情,请参阅启动 Cloud SQL Auth 代理

  1. 查看有关 Cloud SQL 实例的摘要信息(包括实例的连接名称)。

    gcloud

    如需查看有关 Cloud SQL 实例的摘要信息,请使用
    gcloud sql instances describe 命令。

    gcloud sql instances describe INSTANCE_NAME \
    --project=PROJECT_ID \
    --format='value(connectionName)'

    进行以下替换:

    • INSTANCE_NAME:Cloud SQL 实例的名称
    • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号

    连接名称的格式为 PROJECT_ID:REGION_NAME:INSTANCE_NAME

    REST

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

    • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
    • INSTANCE_NAME:实例的名称

    HTTP 方法和网址:

    GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

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

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

    {
      ...
      "connectionName": "PROJECT_ID:REGION_NAME:INSTANCE_NAME"
    }
    

    连接名称的格式为 PROJECT_ID:REGION_NAME:INSTANCE_NAME

  2. 复制实例连接名称。
  3. 启动 Cloud SQL Auth 代理:

    ./cloud-sql-proxy INSTANCE_CONNECTION_NAME --psc 

    INSTANCE_CONNECTION_NAME 替换为您在上一步中复制的实例连接名称。

使用 Cloud SQL 语言连接器进行连接

Cloud SQL 语言连接器库可让您安全访问启用了 Private Service Connect 的 Cloud SQL 实例,而无需授权网络或配置 SSL。

如需允许与 Cloud SQL 语言连接器连接,请设置与为实例提供的建议 DNS 名称匹配的 DNS 记录。DNS 记录是 DNS 资源和域名之间的映射。

Cloud SQL 语言连接器支持通过各自库中的 PSC IP 类型建立 Private Service Connect 连接。

从 App Engine 标准环境、Cloud Run 或 Cloud Run functions 进行连接

如需连接到启用了 Private Service Connect 的 Cloud SQL 实例,您可以使用 App Engine 标准环境Cloud RunCloud Run functions

在这些受支持的无服务器环境中,Cloud SQL 语言连接器以及使用 IP 地址和端口号的直接 TCP 连接均受支持。对于直接 TCP 连接,这是您在创建 Private Service Connect 端点时预留的 IP 地址。您可以将 IP 地址指定为数据库主机的地址。

如果您为端点创建 DNS 记录,则可以为主机指定此记录。

从 BigQuery 连接

如需访问 Cloud SQL 中的数据并通过内部 IP 连接对此数据进行查询,请使用
--enable-google-private-path 参数。此参数仅在以下情况下有效:

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

测试连接性

如需测试与启用了 Private Service Connect 的 Cloud SQL 实例的入站连接,请将 Private Service Connect 端点的 IP 地址设置为目的地 IP 地址。

gcloud

如需为启用了 Private Service Connect 的 Cloud SQL 实例创建连接测试,请使用 gcloud network-management connectivity-tests create 命令:

gcloud network-management connectivity-tests create CONNECTIVITY_TEST_NAME \
--source-instance=SOURCE_INSTANCE \
--destination-cloud-sql-instance=DESTINATION_CLOUD_SQL_INSTANCE \
--destination-network=DESTINATION_NETWORK \
--destination-port=DESTINATION_PORT \
--protocol=tcp

进行以下替换:

  • CONNECTIVITY_TEST_NAME:连接测试的名称。
  • SOURCE_INSTANCE:来源 IP 地址所在的 Compute Engine 实例的 URI(例如 projects/myproject/zones/myzone/instances/myinstance)。
  • DESTINATION_CLOUD_SQL_INSTANCE:Cloud SQL 实例的网址(例如 projects/myproject/instances/myinstance)。
  • DESTINATION_NETWORK:目标 IP 地址所在的 VPC 网络的 URI(例如 projects/myproject/global/networks/mynetwork)。
  • DESTINATION_PORT:为实例预留的端口号。 对于 Cloud SQL for SQL Server 实例,端口号为 1433

REST

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

  • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
  • CONNECTIVITY_TEST_NAME:连接测试的名称。
  • SOURCE_IP_ADDRESS:来源 Compute Engine 实例的 IP 地址。
  • SOURCE_INSTANCE:来源 IP 地址所在的 Compute Engine 实例的 URI(例如 projects/myproject/zones/myzone/instances/myinstance)。
  • SOURCE_NETWORK:来源 IP 地址所在的 VPC 网络的 URI(例如 projects/myproject/global/networks/mynetwork)。
  • DESTINATION_IP_ADDRESS:目标 Cloud SQL 实例的 IP 地址。
  • DESTINATION_PORT:为实例预留的端口号。 对于 Cloud SQL for SQL Server 实例,端口号为 1433
  • DESTINATION_NETWORK:目标 IP 地址所在的 VPC 网络的 URI(例如 projects/myproject/global/networks/mynetwork)。

HTTP 方法和网址:

POST https://networkmanagement.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/connectivityTests?testId=CONNECTIVITY_TEST_NAME

请求 JSON 正文:

{
  "source": {
    "ipAddress": "SOURCE_IP_ADDRESS",
    "instance": "SOURCE_INSTANCE",
    "network": "SOURCE_NETWORK"
  },
  "destination": {
    "ipAddress": "DESTINATION_IP_ADDRESS",
    "port": DESTINATION_PORT,
    "network": "DESTINATION_NETWORK",
    "projectId": "PROJECT_ID"
  },
  "protocol": "TCP"
}

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

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

{
  "name": "projects/PROJECT_ID/locations/global/operations/operation-OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.networkmanagement.v1.OperationMetadata",
    "createTime": "2024-05-23T16:43:49.313981473Z",
    "target": "projects/PROJECT_ID/locations/global/connectivityTests/CONNECTIVITY_TEST_NAME",
    "verb": "create",
    "cancelRequested": false,
    "apiVersion": "v1"
  },
  "done": false
}

限制

  • 您最多可以设置 20 个 Private Service Connect 端点,这些端点连接到启用了 Private Service Connect 的 Cloud SQL 实例的服务连接。
  • 您无法为启用了 Private Service Connect 的实例使用后端
  • 以下标志已失效或受到影响:
    • --no-assign-ip: 使用此标志,因为不支持启用了 Private Service Connect 的实例使用其他连接类型,例如外部 IP 连接
    • --authorized-networks: 您无法使用此标志来添加已获授权的网络
    • --network: 您不能使用此标志,因为它与专用服务访问通道相关联
    • --allocated-ip-range-name: 您不能使用此标志,因为允许的 IP 地址范围名称不受支持
  • 您无法为启用了 Private Service Connect 的实例创建外部副本
  • 您无法在现有实例上激活或停用 Private Service Connect。
  • 您无法将启用了 Private Service Connect 的实例配置为使用专用服务访问通道或外部 IP 连接。
    • 您无法在启用了 Private Service Connect 的实例上启用外部 IP 连接。
    • 您无法为实例启用专用服务访问通道或添加已获授权的网络。
    • 您无法更改实例的连接类型
    • 您无法使用 gcloud sql connect 命令、Cloud Shell、Cloud Build 或 Database Migration Service 连接到启用了 Private Service Connect 的 Cloud SQL 实例。
    • 测试与启用了 Private Service Connect 的 Cloud SQL 实例的连接时,您无法设置以下各项:
      • 直接将实例的内部 IP 地址或 DNS 名称设置为目标
      • 将实例设置为来源
      • 将 Private Service Connect 端点的 IP 地址设置为来源
    • 不支持通过使用已获授权的网络基于 IP 地址列入许可名单。
    • 对于启用了 Private Service Connect 的 Cloud SQL 实例,Managed Service for Microsoft Active Directory(也称为托管式 Microsoft AD)和关联的服务器均不受支持。

    问题排查

    本部分包含有关与启用了 Private Service Connect 的 Cloud SQL 实例相关的问题的信息以及问题排查步骤。

    问题 问题排查
    实例的服务连接不接受 Private Service Connect 端点。
    1. 检查端点的状态。

      gcloud

      如需检查状态,请使用
      gcloud compute forwarding-rules describe 命令。

      gcloud compute forwarding-rules describe ENDPOINT_NAME \
      --project=PROJECT_ID \
      --region=REGION_NAME \
      | grep pscConnectionStatus

      进行以下替换:

      • ENDPOINT_NAME:端点的名称
      • PROJECT_ID:包含端点的 Google Cloud 项目的 ID 或项目编号
      • REGION_NAME:端点的区域名称

      REST

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

      • PROJECT_ID:包含 Private Service Connect 端点的 Google Cloud 项目的 ID 或项目编号
      • REGION_NAME:区域的名称
      • ENDPOINT_NAME:端点的名称

      HTTP 方法和网址:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/forwardingRules/ENDPOINT_NAME

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

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

      {
        "kind": "compute#forwardingRule",
        "id": "ENDPOINT_ID",
        "creationTimestamp": "2024-05-09T12:03:21.383-07:00",
        "name": "ENDPOINT_NAME",
        "region": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME",
        "IPAddress": "IP_ADDRESS",
        "target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/serviceAttachments/SERVICE_ATTACHMENT_NAME",
        "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/forwardingRules/ENDPOINT_NAME",
        "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default",
        "serviceDirectoryRegistrations": [
          {
            "namespace": "goog-psc-default"
          }
        ],
        "networkTier": "PREMIUM",
        "labelFingerprint": "LABEL_FINGERPRINT_ID",
        "fingerprint": "FINGERPRINT_ID",
        "pscConnectionId": "CONNECTION_ID",
        "pscConnectionStatus": "ACCEPTED",
        "allowPscGlobalAccess": true
      }
      
    2. 验证端点状态是否为 ACCEPTED。如果状态为 PENDING,则表示实例不允许包含该端点的 Google Cloud 项目。确保允许在其中创建端点的网络项目。如需了解详情,请参阅修改启用了 Private Service Connect 的实例

    后续步骤