当尝试使用 cloud_sql_proxy 机制连接到CloudSQL实例时,我遇到了一个奇怪的Err 400缺少项目参数
我有一个带有正常工作的CloudSQL postgres数据库的GCE项目,我在计算api上的应用程序可以使用它,并且可以从我在GCE项目中配置的任何VM进行常规的psql。
但是,当我尝试使用cloud_sql_proxy从笔记本电脑连接到数据库时,出现了这个奇怪的错误。
我紧随其后写这篇文档:https://cloud.google.com/sql/docs/postgres/connect-admin-proxy#install
因此,按照我拥有的文档进行操作
{
"type": "service_account",
"project_id": "my-proyect-21432",
"private_key_id": "<hidden intentionally>",
"private_key": "<hidden intentionally>",
"client_email": "cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com",
"client_id": "<hidden intentionally>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com"
}
user@hostname:~$ ./cloud_sql_proxy -instances=db1=tcp:15432 -credential_file=my-proyect-21432.json
2019/05/29 10:17:25 Rlimits for file descriptors set to {&{8500 65536}}
2019/05/29 10:17:25 using credential file for authentication; email=cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com
2019/05/29 10:17:25 Listening on 127.0.0.1:15432 for db1
2019/05/29 10:17:25 Ready for new connections
psql "host=127.0.0.1 port=15432 sslmode=disable dbname=db1 user=dbuser"
我在 cloud_sql_proxy 上看到以下错误:
2019/05/29 10:17:33 New connection for "db1"
2019/05/29 10:17:34 couldn't connect to "db1": googleapi: Error 400: Missing parameter: project., required
在客户端,我得到:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
这时我应该成功连接我的 psql 客户端,并且在网上或Google文档中找不到关于此错误的任何信息
我不知道需要在何处设置 project 参数,我尝试使用 -v 在psql端或在 ?最后没有运气,我也尝试了 -projects 标志,也没有运气。
-编辑:新发现!
我认为我已经解决了这个问题,我所做的第一个设置(如上所述)是在我在家中使用的Windows pc上,今天我在办公室,所以我决定使用macos,我认为操作系统根本不重要,有趣的是,我复制了所有内容并创建了一个小东西,使我向前迈进
所以,我再次开始执行了点1.,2.,3.,4,然后等待?文档指出 instances字符串如下: myproject:us-central1:myinstance 不是我最初写的,所以我进行了更改,开始出现一个更合理的错误:
我启动了 cloud_sql_proxy 与 psql 建立连接,并获得了以下信息:
user@hostname:~$ ./cloud_sql_proxy -instances=my-proyect-21432:us-east1:db1=tcp:15432 -credential_file=my-proyect-21432.json
2019/05/30 14:13:25 Rlimits for file descriptors set to {&{8500 65536}}
2019/05/30 14:13:25 using credential file for authentication; email=cloudsql-serviceaccount@my-proyect-21432.iam.gserviceaccount.com
2019/05/30 14:13:25 Listening on 127.0.0.1:15432 for db1
2019/05/30 14:13:25 Ready for new connections
<< when I run psql>>
2019/05/30 14:14:08 New connection for "my-proyect-21432:us-east1:db1"
2019/05/30 14:15:24 couldn't connect to "my-proyect-21432:us-east1:db1": dial tcp 10.26.112.3:3307: connect: operation timed out
我的db1实例只有专用IP 10.26.112.3
我开始在互联网上寻找该错误,并提出了一个建议,允许传入流量进入3307端口:
Cannot Connect by Cloud SQL Proxy from Cloud Shell By Proxy https://github.com/GoogleCloudPlatform/cloudsql-proxy/issues/164
所以我添加了以下规则:
allow-cloudsqlproxy | Ingress | Apply to all | IP Ranges 0.0.0.0/0 | tcp,udp 3307 | allow | default | 1000
但这没什么区别,因为在那之后我仍然收到相同的错误消息:(
-编辑:来自同一项目上的VM
我在该项目上创建了一个VM,并复制了所有这些内容,我能够连接,端口3307消息上没有连接被拒绝。
我不知道是谁在阻止那个流量...
答案 0 :(得分:1)
感谢您向我们提供最新调查结果。我遇到了同样的问题。我刚刚解决了它-您的第一个编辑提示了我。
在遵循Google CloudSQL文档过程从外部应用程序连接到CloudSQL的过程中,我像这样启动了代理服务器:
Applications/XAMPP/xamppfiles/
它没有让我联系。我收到此错误
installing XAMPP again
在阅读完您的编辑后,我修改了命令以使用实例详细信息页面上所述的整个实例名称,并且它可以正常工作。这是使它起作用的新命令。
`./cloud_sql_proxy -instances=<instance_name>=tcp:5433`
我希望这可以节省一些时间。
答案 1 :(得分:0)
好吧,如果您的数据库实例仅具有一个私有IP 地址,显然 cloud_sql_proxy 不起作用,我必须添加一个公共IP,以便代理服务器可以访问我的实例。
我了解某些限制,但是如果Google提供了 cloud_sql_proxy ,它应该支持所有客户案例,我的意思是,我使用的是默认网络,该网络由Google管理,因此该网络应允许代理服务器访问我的数据库实例。。我不知道...
第二个我添加了公共IP ,第二个它开始工作了……但是老实说,我不想在我的数据库实例上使用公共IP。
答案 2 :(得分:0)
实际上,当您的Cloud SQL实例只有一个内部IP地址时,cloudsql-proxy可以工作。在这种情况下,您将使用私有服务访问权限来建立cloudsql-proxy和Cloud SQL实例之间的连接。还建议使用选项--ip_address_types = PRIVATE执行代理,以在连接到Cloud SQL实例时强制其使用内部IP而不是公共IP。
我希望这会有所帮助。
答案 3 :(得分:0)
无论听起来多么微不足道,对我来说,Kubernetes部署文件中的CloudSQL代理映像从gcr.io/cloudsql-docker/gce-proxy:1.05
到gcr.io/cloudsql-docker/gce-proxy:latest
*的更新解决了这个问题。
考虑到问题作者的最终评论,我相信这可能是CloudSQL的错误,需要您触发一些将完全重新启动其实例的操作。但这只是猜测。
*我在版本1.16
上尝试过此操作。如果不确定期货发行的稳定性,可以指定版本而不是latest
标签。