通过 Cloud SQL 代理连接 Postgres Cloud SQL

3
我在 Cloud SQL 上创建了单区域的 PostgreSQL 数据库实例,现在我正在尝试使用 Cloud SQL 代理进行连接。
/cloud_sql_proxy -instances=<PROJECT_ID>:us-central1:staging=tcp:5432 -credential_file=./<SERVICE_ACCOUNT_KEY_FILE> 

这个正在运行很好。但是当我运行以下命令时,
psql "host=127.0.0.1 sslmode=disable dbname=postgres user=postgres"

代理显示以下错误:
2019/11/14 15:20:10 using credential file for authentication; email=<SERVICE_ACCOUNT_EMAIL>
2019/11/14 15:20:13 Listening on 127.0.0.1:5432 for <PROJECT_ID>:us-central1:staging
2019/11/14 15:20:13 Ready for new connections
2019/11/14 15:20:34 New connection for "<PROJECT_ID>:us-central1:staging"
2019/11/14 15:22:45 couldn't connect to "<PROJECT_ID>:us-central1:staging": dial tcp 34.70.245.249:3307: connect: connection timed out

为什么会发生这种情况? 我是从本地进行操作。

4个回答

2
我刚刚按照这个 tutorial 一步一步地操作,结果完美地运行了。
我没有做任何额外的步骤(如白名单IP、打开端口等...),而且这是在一个干净的项目中完成的。
您是从本地使用SDK还是从Cloud Shell尝试进行操作?您是否有任何防火墙限制?
如果您能提供关于您特定设置方面的更多信息,那么肯定会有所帮助。
请告诉我们。
编辑:
确保您的3307端口没有被任何东西阻止。
查看这个 官方文档 进行说明。

这个本地是否适用于私有的Cloud SQL?如果可以,那么您还做了哪些其他网络配置才能让它正常工作呢? - Vincent Gerris

1

在连接服务账户之前,请确保已将所有必需的IAM角色附加到该账户:

例如,可以使用gcloudcloudsql中检索角色列表:

$ gcloud iam  roles list --filter 'name~"roles/cloudsql"' --format 'table(name, description)'                                          

NAME                         DESCRIPTION
roles/cloudsql.admin         Full control of Cloud SQL resources.
roles/cloudsql.client        Connectivity access to Cloud SQL instances.
roles/cloudsql.editor        Full control of existing Cloud SQL instances excluding modifying users, SSL certificates or deleting resources.
roles/cloudsql.instanceUser  Role allowing access to a Cloud SQL instance
roles/cloudsql.serviceAgent  Grants Cloud SQL access to services and APIs in the user project
roles/cloudsql.viewer        Read-only access to Cloud SQL resources.

如果您的服务帐户缺少适当的角色,则无法连接到实例,以使IAM身份验证正常工作。

0
问题可能是您不在VPC网络中,例如当您从localhost连接时,云代理显示无法连接到远程IP地址。如果使用私有IP地址,请仔细阅读此内容。

https://cloud.google.com/sql/docs/postgres/private-ip

请注意,Cloud SQL 实例位于 Google 管理的网络中,代理旨在简化 VPC 网络内连接到数据库。
简而言之:从本地计算机运行 cloud-sql-proxy 将无法工作,因为它不在 VPC 网络中。它应该从连接到与数据库相同的 VPC 的 Compute Engine VM 中运行。
通常我使用 gcloud ssh 从本地计算机进行解决,并通过 compute engine 中的小型 VM 转发端口,例如:
gcloud beta compute ssh --zone "europe-north1-b" "instance-1" --project "my-project" -- -L 5432:cloud_sql_server_ip:5432
然后您可以连接到 localhost:5432(确保没有其他东西正在运行,或将第一个端口号更改为本地可用的端口)。
还应该是设置 VPN 连接到 VPC 网络,然后在该网络中的节点中运行云代理。
我必须说,我觉得这真的很令人困惑,因为它给人的印象是代理与 gloud 做类似的魔术。我不明白为什么一些 Google 工程师还没有将其整合在一起,这并不难。

0

我之前遇到过这个问题,当时没有指定 port 参数给 psql,你可以试一下这个:

psql "host=127.0.0.1 port=5432 sslmode=disable user=postgres"

不要指定数据库,看看能否让你进入提示符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接