从同时具有私有IP和公共IP的VM连接到私有IP上的Google Cloud SQL实例失败

时间:2020-09-11 19:23:27

标签: postgresql google-cloud-platform terraform google-cloud-sql terraform-provider-gcp

我要设置的内容:

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

配置代码

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

  1. 创建一个新的一次性Google Cloud项目。
  2. 为方便起见,您可以运行bootstrap.sh来启用正确的服务(它将询问Google项目的ID,并假设您具有已登录并可以访问的gcloud客户端)。
  3. 在项目中创建一个服务帐户,为方便起见,使其成为所有者,然后将密钥文件保存在./local-secrets/google-project-credentials.json
  4. 使用项目ID和服务帐户的电子邮件更新terraform.tfvars
  5. terraform workspace new staging
  6. terraform init
  7. terraform apply

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

  1. SSH进入虚拟机并运行sudo apt install postgresql-client-common postgresql-client
  2. 查找数据库实例的IP地址
  3. 运行此命令(根据需要修改详细信息)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 个答案:

答案 0 :(得分:1)

此问题的原因是我无法理解网络接口可以具有 公用IP和专用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