配置公共 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 控制台中,进入 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 响应:

Terraform

如需启用公共 IP 并添加已获授权的地址或地址范围,请使用 Terraform 资源

resource "google_sql_database_instance" "postgres_public_ip_instance_name" {
  database_version = "POSTGRES_14"
  name             = "postgres-public-ip-instance-name"
  region           = "asia-southeast2"
  settings {
    availability_type = "ZONAL"
    ip_configuration {
      # Add optional authorized networks
      # Update to match the customer's networks
      authorized_networks {
        name  = "test-net-3"
        value = "203.0.113.0/24"
      }
      # Enable public IP
      ipv4_enabled = true
    }
    tier = "db-custom-2-7680"
  }
  deletion_protection = false # set to true to prevent destruction of the resource
}

应用更改

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

  1. 启动 Cloud Shell
  2. 设置要应用 Terraform 配置的 Google Cloud 项目:
    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    
  3. 创建一个目录,并在该目录中打开一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf
    mkdir DIRECTORY && cd DIRECTORY && nano main.tf
    
  4. 将示例复制到 main.tf
  5. 查看和修改要应用到您的环境的示例参数。
  6. 依次按 Ctrl-xy 保存更改。
  7. 初始化 Terraform:
    terraform init
  8. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

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

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

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

删除更改

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

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

    terraform destroy

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 控制台中,进入 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 控制台中,进入 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 控制台中,进入 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 方法和网址:

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

  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 方法和网址:

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

  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
   

后续步骤