配置公共 IP 连接

本页面将介绍如何为 Cloud SQL 实例配置公共 IP 连接。

简介

您可以将 Cloud SQL 实例配置为具有一个公共 IPv4 地址,并通过向该实例添加已获授权的 IP 地址,接受来自特定 IP 地址或地址范围的连接。

您不能将专用网络(例如 10.x.x.x)指定为已获授权的网络。

PostgreSQL 实例的公共 IP 地址:

  • IPv6:实例不支持 IPv6。
  • IPv4:实例具有自动分配的静态 IPv4 地址。关闭(停用)实例时,IP 地址将产生少量费用。

有关通过 IP 连接将管理客户端连接到实例的帮助信息,请参阅使用 IP 地址连接 psql 客户端

如果您将实例配置为使用其公共 IP 地址接受连接,请同时将其配置为使用 SSL 来保护数据安全。如需了解详情,请参阅为实例配置 SSL

如要为实例配置未向公共互联网公开的 IP 地址,请参阅配置专用 IP 连接

启用公共 IP 并添加已获授权的地址或地址范围

当您为实例启用公共 IP 时,Cloud SQL 会为该实例配置一个公共静态 IPv4 地址。启用公共 IP 后,您必须设置数据库连接授权。如需了解详情,请参阅授权选项

要启用公共 IP 并添加一个已获授权的地址,请执行以下操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 从 SQL 导航菜单中选择连接
  4. 选择公共 IP 复选框。
  5. 点击添加网络
  6. 网络字段中,输入要允许连接的 IP 地址或地址范围。

    使用 CIDR 表示法

  7. 输入此条目的名称(可选)。
  8. 点击完成
  9. 点击保存以更新实例。

gcloud

  1. 如果您还没有为实例添加一个 IPv4 地址,请先添加:
    gcloud sql instances patch INSTANCE_NAME\
    --assign-ip
    
  2. 描述实例以显示所有已获授权的现有地址:
    gcloud sql instances describe INSTANCE_NAME
    

    ipConfiguration 下查找 authorizedNetwork 条目,并记下您要保留的所有已获授权的地址。

  3. 更新授权网络列表,以加入您想要的所有地址。
    gcloud sql instances patch INSTANCE_NAME \
    --authorized-networks=IP_ADDR1,IP_ADDR2...
    

    使用 CIDR 表示法

  4. 确认所做的更改:
    gcloud sql instances describe INSTANCE_NAME
    

REST v1beta4

  1. 描述实例以显示所有已获授权的现有地址:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

  2. 更新实例,以加入您要为实例设置的所有地址:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • network_range_1:已获授权的 IP 地址或范围
    • network_range_2:另一个已获授权的 IP 地址或范围

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
      "settings":
      {
        "ipConfiguration":
        {
          "authorizedNetworks":
            [{"value": "network_range_1"}, {"value": network_range_2"}]
        }
      }
    }
    

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

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

    使用 CIDR 表示法

  3. 确认所做的更改:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • ip-address1:第一个 IP 地址(CIDR 形式)
    • ip-address-name1:第一个 IP 地址的名称
    • ip-address2:第二个 IP 地址(CIDR 形式)
    • ip-address-name2:第二个 IP 地址的名称
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

移除已获授权的地址或地址范围

要移除某个授权地址,请按如下所述操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 从 SQL 导航菜单中选择连接
  4. 点击要删除的地址对应的删除图标 删除。
  5. 点击保存以更新实例。

gcloud

  1. 描述实例以显示所有现有授权地址:
    gcloud sql instances describe INSTANCE_NAME
    

    ipConfiguration 下查找 authorizedNetwork 条目,并记下您要保留的所有已获授权的地址。

  2. 更新已获授权的网络列表,以舍弃您要移除的所有地址。
    gcloud sql instances patch INSTANCE_NAME \
    --authorized-networks=IP_ADDR1,IP_ADDR2...
    
  3. 确认所做的更改:
    gcloud sql instances describe INSTANCE_NAME
    

REST v1beta4

  1. 描述实例以显示所有已获授权的现有地址:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • ip-address1:第一个 IP 地址(CIDR 形式)
    • ip-address-name1:第一个 IP 地址的名称
    • ip-address2:第二个 IP 地址(CIDR 形式)
    • ip-address-name2:第二个 IP 地址的名称
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

  2. 更新实例,以加入您要保留的所有地址并舍弃您要移除的所有地址:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • network_range_1:要移除的已获授权的 IP 地址或网络范围

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
      "settings":
      {
        "ipConfiguration":
        {
          "authorizedNetworks":
            [{"value": "network_range_1"}]
        }
      }
    }
    
    

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

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

  3. 确认所做的更改:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • ip-address:IP 地址(CIDR 形式)
    • ip-address-name:IP 地址的名称
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

将实例配置为拒绝所有公共 IP 连接

要将实例配置为拒绝所有公共 IP 连接,请执行以下操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 从 SQL 导航菜单中选择连接
  4. 点击所有已获授权的地址对应的删除图标 删除。
  5. 点击保存以更新实例。

gcloud

  1. 清除授权地址列表:
    gcloud sql instances patch INSTANCE_NAME \
    --clear-authorized-networks
    
  2. 确认所做的更改:
    gcloud sql instances describe INSTANCE_NAME
    

REST v1beta4

  1. 描述实例以显示所有已获授权的现有地址:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • ip-address1:第一个 IP 地址(CIDR 形式)
    • ip-address-name1:第一个 IP 地址的名称
    • ip-address2:第二个 IP 地址(CIDR 形式)
    • ip-address-name2:第二个 IP 地址的名称
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

  2. 更新实例,以清空地址列表:

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

    • project-id:项目 ID
    • instance-id:实例 ID

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
      "settings":
      {
        "ipConfiguration":
        {
          "authorizedNetworks": []
        }
      }
    }
    

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

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

  3. 确认所做的更改:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

停用公共 IP

您可以停用公共 IP,但前提是您的实例也配置为使用专用 IP。如需启用专用 IP,请参阅将现有实例配置为使用专用 IP

如需停用公共 IP,请按如下所述操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 从 SQL 导航菜单中选择连接
  4. 取消选择公共 IP 复选框。
  5. 点击保存以更新实例。

gcloud

  1. 更新实例:
    gcloud sql instances patch INSTANCE_NAME \
    --no-assign-ip
    
  2. 确认所做的更改:
    gcloud sql instances describe INSTANCE_NAME
    

REST v1beta4

  1. 描述实例以显示所有已获授权的现有地址:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • ip-address1:第一个 IP 地址(CIDR 形式)
    • ip-address-name1:第一个 IP 地址的名称
    • ip-address2:第二个 IP 地址(CIDR 形式)
    • ip-address-name2:第二个 IP 地址的名称
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

  2. 更新实例:

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

    • project-id:项目 ID
    • instance-id:实例 ID

    HTTP 方法和网址:

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

    请求 JSON 正文:

    {
      "settings":
      {
        "ipConfiguration": {"ipv4Enabled": false}
      }
    }
    

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

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

  3. 确认所做的更改:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • machine-type:实例机器类型
    • zone:实例区域

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

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

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

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
FATAL: database 'user' does not exist gcloud sql connect --user 仅适用于默认的“postgres”用户。 使用默认用户进行连接,然后更改用户。
SSL error: invalid padding 服务器证书错误。 创建新的服务器证书轮替
您想知道是谁处于连接状态。 不适用 请参阅可以尝试的操作
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 Service Networking 服务帐号并未绑定到 servicenetworking.serviceAgent 角色。 将 Service Networking 服务帐号绑定到 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 上的这一讨论,其中包括了解决方法。
在某些操作系统中无法解析证书。 使用来自 mac OS 11.0 (Big Sur) 的 x509 库的客户端可能无法解析 postgres 实例的某些证书。此错误可能会以一般错误的形式呈现给客户端,例如“已取消”。 解决方法是轮替服务器证书重新创建客户端证书
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 packetsAborted connection xxx to db: DB_NAME

可能的问题

  • 网络不稳定。
  • 没有对 TCP keep-alive 命令的响应(客户端或服务器无响应,可能超载)。
  • 超出了数据库引擎的连接生命周期,服务器终止了该连接。

可以尝试的操作

应用必须能够容忍网络故障并遵循最佳做法,例如连接池和重试。大多数连接池程序会尽可能捕获这些错误。否则,应用必须正常重试或失败。

对于连接重试,我们建议使用以下方法:

  1. 指数退避算法。以指数方式增加每次重试之间的时间间隔。
  2. 另外,增加随机退避时间。
结合使用这些方法有助于减少限制。


严重错误:数据库“用户”不存在

尝试使用 gcloud sql connect --user 连接到 PostgreSQL 实例时,您看到错误消息 FATAL: database 'user' does not exist

可能的原因

gcloud sql connect --user 命令仅适用于默认用户 (postgres)。

可以尝试的操作

解决方法是使用默认用户进行连接,然后使用 "\c" psql 命令以其他用户身份重新连接。


SSL 错误:填充无效

尝试使用 SSL 连接到 PostgreSQL 实例时,您看到错误消息 SSL error: invalid padding

可能的问题

服务器 CA 证书可能存在问题。

可以尝试的操作

创建新的服务器 CA 证书轮替服务器证书。


想知道是谁处于连接状态

您想知道是谁处于连接状态及连接了多长时间。

可能的问题

不适用

可以尝试的操作

登录到数据库并运行以下命令:SELECT datname, usename, application_name as appname, client_addr, state, now() - backend_start as conn_age, now() - state_change as last_activity_age FROM pg_stat_activity WHERE backend_type = 'client backend' ORDER BY 6 DESC LIMIT 20</code>


没有连接权限

您看到错误消息 Unauthorized to connect

可能的原因

由于在多个级层进行授权,因此可能存在多个原因。

  • 在数据库级层,数据库用户必须存在且其密码必须一致。
  • 在项目级,用户可能缺少正确的 IAM 权限。
  • 在 Cloud SQL 级层,根本原因可能取决于您连接到实例的方式。如果您要通过公共 IP 直接连接到实例,则连接的来源 IP 必须在实例已获授权的网络中。

    默认允许专用 IP 连接,除非您从非 RFC 1918 地址进行连接。非 RFC 1918 客户端地址必须配置为已获授权的网络

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

    gcloud compute networks peerings update cloudsql-postgres-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
    

    如果您要通过 Cloud SQL Auth 代理进行连接,请确保正确设置了 IAM 权限

  • 在网络级层,如果 Cloud SQL 实例使用公共 IP,则连接的来源 IP 必须在已获授权的网络中。

可以尝试的操作

  • 检查用户名和密码。
  • 检查用户的 IAM 角色和权限。
  • 如果使用公共 IP,请确保来源在已获授权的网络中。

网络关联失败

您看到错误消息 Error: Network association failed due to the following error:在使用方项目中将 Service Networking 服务帐号设置为 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 标志的值。


在使用方项目中将 Service Networking 服务帐号设置为 servicenetworking.serviceAgent 角色

您看到错误消息 set Service Networking service account as servicenetworking.serviceAgent role on consumer project.

可能的原因

Service Networking 服务帐号并未绑定到 servicenetworking.serviceAgent 角色。

可以尝试的操作

如需缓解此问题,请尝试使用这些 gcloud 命令将 Service Networking 服务帐号绑定到 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 上的这一讨论,其中包括了解决方法。


在某些操作系统中无法解析证书

使用来自 mac OS 11.0 (Big Sur) 的 x509 库时,您可能无法解析 postgres 实例的证书。此错误可能会以一般错误的形式呈现,例如“已取消”。

可以尝试的操作

Bug 已修复,新实例不会遇到此问题。对于遇到此问题的旧实例,请轮替服务器证书重新创建客户端证书


无法修改 CreateConnection 中分配的范围。请使用 UpdateConnection

您看到错误消息 Cannot modify allocated ranges in CreateConnection. Please use UpdateConnectionThe operation "operations/1234" resulted in a failure "Allocated IP range 'xyz' not found in network

可能的问题…

当您尝试使用其他预留范围重新建立连接时,会收到第一个错误。

如果分配的范围已修改,但 vpc-peerings 未更新,您将会看到第二个错误。

可以尝试的操作

您需要修改专用连接。使用以下命令,并务必使用 --force 参数:

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

后续步骤