无法通过云代理从云Shell连接到Cloud SQL Proxy

10
我正在遵循GAE的Django示例,并且在使用Google Cloud Shell通过代理连接Cloud SQL实例时遇到了问题。可能与权限设置有关,因为我看到请求未经授权。
其他上下文:
1. "gcloud beta sql connect auth-instance --user=root" 可以正常连接。 2. 我有一个SQL Proxy客户端的服务账号。
我可能漏掉了某些东西。能否有人请指点一下?先行致谢。
代理日志:
./cloud_sql_proxy -instances=auth-158903:asia-east1:auth-instance=tcp:3306

2017/02/17 14:00:59 Listening on 127.0.0.1:3306 for auth-158903:asia-east1:auth-instance
2017/02/17 14:00:59 Ready for new connections
2017/02/17 14:01:07 New connection for "auth-158903:asia-east1:auth-instance"
2017/02/17 14:03:16 couldn't connect to "auth-158903:asia-east1:auth-instance": dial tcp 107.167.191.26:3307: getsockopt: connection timed out

客户端日志:
mysql -u root -p --host 127.0.0.1
Enter password: 
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

我也尝试使用凭据文件,但仍然没有成功。
./cloud_sql_proxy -instances=auth-158903:asia-east1:auth-instance=tcp:3306 -credential_file=Auth-2eede8ae0d0b.jason

2017/02/17 14:21:36 using credential file for authentication; email=sql-proxy-client@auth-158903.iam.gserviceaccount.com
2017/02/17 14:21:36 Listening on 127.0.0.1:3306 for auth-158903:asia-east1:auth-instance
2017/02/17 14:21:36 Ready for new connections
2017/02/17 14:21:46 New connection for "auth-158903:asia-east1:auth-instance"
2017/02/17 14:21:48 couldn't connect to "auth-158903:asia-east1:auth-instance": ensure that the account has access to "auth-158903:asia-east1:auth-instance" (and make sure there's no typo in that name). Error during get instance auth-158903:asia-east1:auth-instance: googleapi:     **Error 403: The client is not authorized to make this request., notAuthorized**
3个回答

4

如果我只为我的服务账户授予“Cloud SQL客户端”IAM角色,我可以完全重现这个问题。当我也授予我的服务账户“Cloud SQL查看器”角色时,它就可以连接了。我建议您尝试这样做,看看是否有所帮助。


感谢您的建议。API已经通过了,但我仍然无法连接到Cloud SQL。我已将所有权限添加到服务帐户中的Cloud SQL中。API仪表板显示请求和Google Cloud SQL API没有错误。出于某种原因,仍然无法通过代理连接到云SQL。我正在使用云shell。将所有网络(0.0.0.0/0)和云shell机器(gcloud beta sql connect)添加到授权网络中。仍然无法连接。代理的错误消息是“getsockopt:连接超时”。 - YSC

3
似乎是网络连接问题。 如果您使用私人IP,请认真阅读以下内容: https://cloud.google.com/sql/docs/mysql/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 3306:cloud_sql_server_ip:3306

然后你可以连接到 localhost:3306(确保没有其他正在运行的应用程序,或者将端口号更改为本地空闲的端口号)


那么CloudSQL代理的意义是什么? - csaroff
2
这也是我的初步想法,答案在文档中,说明它的作用是代理来自VPC网络内部的请求。我同意“代理”这个名称有点误导,让我以为我可以直接从本地计算机连接。不过,“简单”的端口转发就足够了。 - Vincent Gerris
1
我仍然不理解CloudSQL代理的意义。一旦你在VPC内部,你可以直接使用私有IP访问数据库,对吧?为什么需要从VPC内部进行代理呢? - csaroff
也许如果你有多个问题?说实话我不确定。但为什么不去谷歌问问呢?进入文档并使用反馈/创建工单。我个人觉得它没有用处,也许从集群内部,我只是停止查找并使用端口转发通过ssh连接本地DB客户端。 - Vincent Gerris
1
如前所述,云SQL代理允许您从云SQL实例创建到VPC网络上的VM的隧道。从那里,您可以创建一个IAP隧道,从您的本地计算机连接到在VM上运行的代理。这使您能够例如使用基于GUI的SQL编辑器(如pgAdmin)访问私有云SQL实例。 - adjuric

2

Cloud SQL代理使用的端口是3307,而不是通常的MySQL端口3306。这是因为它以不同的方式使用TLS,并且具有不同的IP ACL。因此,默认情况下允许MySQL流量的防火墙将不允许Cloud SQL代理。

请检查您的网络上是否有阻止端口3307的防火墙。要使用Cloud SQL代理,请授权此端口进行出站连接。


1
这不是答案,不需要防火墙规则。我在一个独立的项目中已经让它工作了,而且没有任何相关的防火墙规则,但在我们的新项目中它根本不起作用。没有使用私有IP。 - Nathan McKaskle

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