配置公共 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 v1

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

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

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

    HTTP 方法和网址:

    GET  https://sqladmin.googleapis.com/v1/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/v1/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/v1/projects/project-id/instances/instance-id?fields=settings

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

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

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 v1

  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/v1/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/v1/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/v1/projects/project-id/instances/instance-id?fields=settings

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

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

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 v1

  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/v1/projects/project-id/instances/instance-id?fields=settings

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

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

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

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

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

    HTTP 方法和网址:

    PATCH https://sqladmin.googleapis.com/v1/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/v1/projects/project-id/instances/instance-id?fields=settings

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

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

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 v1

  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/v1/projects/project-id/instances/instance-id?fields=settings

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

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

  2. 更新实例:

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

    • project-id:项目 ID
    • instance-id:实例 ID
    • vpc-name:您要用于此实例的 VPC 网络的名称
    • allocated-ip-range:可选。如果指定此标志,则系统会设置为其分配 IP 范围的范围名称。范围名称应符合 RFC-1035,并且长度介于 1-63 个字符之间。

    HTTP 方法和网址:

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

    请求 JSON 正文:

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

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

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

  3. 确认所做的更改:

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

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

    HTTP 方法和网址:

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

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

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

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
    • vpc-name:您要用于此实例的 VPC 网络的名称
    • allocated-ip-range:可选。如果指定此标志,则系统会设置为其分配 IP 范围的范围名称。范围名称应符合 RFC-1035,并且长度介于 1-63 个字符之间。

    HTTP 方法和网址:

    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 响应:

  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 响应:

问题排查

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

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

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

  1. 指数退避算法。以指数方式增加每次重试之间的时间间隔。
  2. 另外,增加随机退避时间。

结合使用这些方法有助于减少限制。

FATAL: database 'user' does not exist gcloud sql connect --user 仅适用于默认的 postgres 用户。

使用默认用户进行连接,然后更改用户。

您想知道是谁处于连接状态。 登录到数据库并运行以下命令:


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
   

后续步骤