【问题标题】:Not able to connect using private IP via cloud sql proxy in Google Cloud Shell -无法通过 Google Cloud Shell 中的云 sql 代理使用私有 IP 进行连接 -
【发布时间】:2021-06-02 02:50:53
【问题描述】:

我尝试跑https://github.com/terraform-google-modules/terraform-google-sql-db/tree/v4.5.0/examples/mysql-private

它创建带有 privateIP 和 publicIP 的 sql 实例。那挺好的。 但是当我尝试连接到 mysql 时,它会这样说,

来自 gcloud 的命令:

./cloud_sql_proxy -credential_file=mysql-service-account.json -instances=sample:example-mysql-private-fd7795e5=tcp:3306 -ip_address_types=PRIVATE &

mysql -u default -p -h 127.0.0.1 --port=3306 default

问题 - 为什么它连接到端口 3307?如何解决这个问题。

couldn't connect to "sample:example-mysql-private-fd7795e5": dial tcp 10.127.0.4:3307: connect: connection timed out.

私有 VPC 网络是否必须进行任何更改才能连接它?

但是没有 Private IP ,它确实可以连接并且可以工作,因为它通过 PublicIP 进行,但是为什么私有 IP 仍然无法连接?

有效的命令:

./cloud_sql_proxy -credential_file=mysql-service-account.json -instances=sample:example-mysql-private-fd7795e5=tcp:3306 &

mysql -u default -p -h 127.0.0.1 --port=3306 default

这是我来自 main.tf 的 VPC 配置:

# ------------------------------------------------------------------------------
# CREATE A RANDOM SUFFIX AND PREPARE RESOURCE NAMES
# ------------------------------------------------------------------------------

resource "random_id" "name" {
  byte_length = 2
}

locals {
  # If name_override is specified, use that - otherwise use the name_prefix with a random string
  instance_name        = var.name_override == null ? format("%s-%s", var.name_prefix, random_id.name.hex) : var.name_override
  private_network_name = "private-network-${random_id.name.hex}"
  private_ip_name      = "private-ip-${random_id.name.hex}"
}

# ------------------------------------------------------------------------------
# CREATE COMPUTE NETWORKS
# ------------------------------------------------------------------------------

# Simple network, auto-creates subnetworks
resource "google_compute_network" "private_network" {
  provider = google-beta
  name     = local.private_network_name
}

# Reserve global internal address range for the peering
resource "google_compute_global_address" "private_ip_address" {
  provider      = google-beta
  name          = local.private_ip_name
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.private_network.self_link
}

# Establish VPC network peering connection using the reserved address range
resource "google_service_networking_connection" "private_vpc_connection" {
  provider                = google-beta
  network                 = google_compute_network.private_network.self_link
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

请帮忙。

【问题讨论】:

    标签: mysql google-cloud-platform terraform google-cloud-sql cloud-sql-proxy


    【解决方案1】:

    Cloud Shell 不在您的 VPC 中。所以你不能通过私有IP访问你的数据库。您需要在您的 VPC(堡垒虚拟机)中创建一个虚拟机以使用私有 IP 并打开通往该虚拟机的隧道。我写了an article on this

    【讨论】:

    • 嗨@guillaume blaquiere 感谢您的澄清,它确实在具有 0 - 防火墙规则的 VPC 网络下创建了一个私有网络-d95b。当我创建 Compute Engine > 创建实例 > 网络时,选择 private-network-d95b > 它不是 SSH 进入 VM。为什么会有这种行为?
    • 您的 VM 上是否有公共 IP?您在 VPC 网络上打开的防火墙规则是什么?
    • 嗨@guillaume blaquiere,我在私有网络-d95b 中没有看到任何防火墙规则...附上了我的 main.tf vpc 配置。我应该在那里添加任何防火墙规则吗?我确实有 VM 的公共 IP 是的。看起来需要为 VPC> private-network-d95b 启用一些防火墙规则。你能帮我如何在 main.tf 文件中添加一个吗?
    • 你需要为你的IP打开22端口或者在22端口打开IAP端口范围35.235.240.0/20才能通过SSH访问VM
    • 嗨@guillaume blaquiere 我如何从 terraform 脚本中做到这一点。我是否需要为网络添加任何防火墙?以便将规则添加到 vpc 网络,然后同一网络上的 VM 可以使用 SSH?
    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2021-01-28
    • 2018-06-03
    • 2022-11-10
    • 1970-01-01
    • 2021-05-06
    • 2021-09-14
    相关资源
    最近更新 更多