首页 > 解决方案 > 从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

问题描述

我要设置的内容:

配置代码

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

  1. 创建一个新的一次性 Google Cloud 项目。
  2. 为方便起见,您可以运行 bootstrap.sh 来启用正确的服务(它会询问 Google 项目的 ID,并假设您有一个已登录并有权访问的 gcloud 客户端)。
  3. 在项目中创建一个service account,为了方便就将其设为owner,并在其中保存一个key文件./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

怎么了?

我错过了什么?

标签: postgresqlgoogle-cloud-platformterraformgoogle-cloud-sqlterraform-provider-gcp

解决方案


这个问题的原因是我无法理解网络接口可以同时具有公共和私有 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


推荐阅读