从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

Posted

技术标签:

【中文标题】从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败【英文标题】:Connecting to Google Cloud SQL instance on private IP from a VM with both private and public IPs fails 【发布时间】:2020-12-30 08:06:15 【问题描述】:

我要设置的内容:

具有私有 IP、Postgresql 数据库的 Cloud SQL 实例 具有一个公共 IP 和一个私有 IP 的 VM 与 SQL 实例位于同一 VPC 网络上(VM、SQL 实例和 VPC 都在同一区域中) VM 具有具有足够 Cloud SQL 客户端/查看者权限的服务帐号 VM 上的 SQL 代理连接到 SQL 实例。我使用在某些文档中找到的 -ip_address_types=PRIVATE 参数运行它。

配置代码

用于重现令我困惑的状态的稍微简化的 Terraform 代码如下: https://github.com/hallvors/gcp-network-issue-demo 要对此进行测试,请执行以下操作:

    创建一个新的一次性 Google Cloud 项目。 为方便起见,您可以运行 bootstrap.sh 以启用正确的服务(它会询问 Google 项目的 ID,并假设您有一个已登录并具有访问权限的 gcloud 客户端)。 在项目中创建一个服务账号,为了方便就将其设为owner,并在./local-secrets/google-project-credentials.json中保存一个key文件 使用项目 ID 和服务帐户的电子邮件更新 terraform.tfvars terraform workspace new staging terraform init terraform apply

Terraform 完成后,您应该在项目中设置一个数据库和一个虚拟机。

    SSH 进入虚拟机并运行sudo apt install postgresql-client-common postgresql-client 查找数据库实例的 IP 地址 运行此(根据需要修改详细信息)psql --host 10.167.0.3 -U gcp-network-issue-demo-staging-db-user gcp-network-issue-demo-staging-database

会发生什么?

任何实际使用连接的尝试(例如来自 psql 客户端或 db-migrate)都会超时 如果我从设置中删除 VM 的公共 IP 地址,它可以正常连接。但是,我需要一个可公开访问的 VM 以供其他服务连接到它。

我错过了什么?

【问题讨论】:

您缺少详细信息。 1) 准确展示您是如何启动 Cloud SQL 代理的。 2) 通过psql 等准确显示您是如何连接的。 3) 什么是10.240.0.3? 4)实际分配给服务帐户的角色是什么? 5) 如果 Cloud SQL 在同一个 VPC 中寻址,则不需要 Cloud SQL 代理,只需使用正确的 PostgreSQL 凭据直接连接到私有 IP 地址。 感谢您的评论!我将添加详细信息 :) 我知道我并不严格需要 SQL 代理(但直接连接超时的方式相同) - 但是使用它有一些好处,例如仅使用实例引用而不是使用 IP 地址配置事物. 1) 确认您可以使用私有 IP 地址直接连接。 2)您是否授权可以连接的网络?您可能已经覆盖了阻止 RFC1918(私有)地址的授权网络。看命令:gcloud sql instances patch INSTANCE_NAME --authorized-networks 直接连接也失败psql --host 10.240.0.3 -U postgres slipway-refactored-staging-database psql: could not connect to server: Connection timed out Is the server running on host "10.240.0.3" and accepting TCP/IP connections on port 5432?你的意思是添加我的VM的公共IP地址作为授权?我尝试运行` gcloud sql instances --project slipway-refactored patch slipway-refactored-staging-database-instance --authorized-networks 35.228.181.106`,但似乎没有什么不同。 发生了很多事情。对我来说,有 Terraform 问题和连接性问题。一个新的连接问题将简化事情。 【参考方案1】:

这个问题的原因是我没有理解网络接口可以有公共和私有 IP/网络。所以我的代码为 google_compute_instance 设置了一个公共接口和一个专用网络接口:

  # Update VM needs a public IP
  network_interface 
    network = "default"
    access_config 
    
  

  network_interface 
    network    = var.network
    subnetwork = var.subnetwork
  

现在,我仍然不完全了解网络,但您似乎无法(很容易?)指定数据库连接尝试应使用的接口,并且它不会自动选择正确的接口。修复在此提交中,同时配置对专用网络和公共网络接口的访问:

https://github.com/hallvors/gcp-network-issue-demo/commit/ea14174c1087c89b92310b5b4913e12a4e17130d

【讨论】:

以上是关于从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败的主要内容,如果未能解决你的问题,请参考以下文章

具有私有 IP 的 AWS Gitlab Autoscale 运行器,不想启用公共 IP

为啥mysql客户端不使用--ssl-ca操作可以通过私有IP连接到启用SSL的mysql5.6,但不能通过公共IP?

AWS EC2 公共 IP 与私有 IP

如何在谷歌云平台中使用私有 IP 从我的电脑连接到 sql 实例

在使用私有 IP 连接到云 sql 的云构建上运行数据库迁移

仅具有私有 IP 的 Azure VM 的 Ansible 动态清单