获取奇怪的googleapi Err 400消息连接到Postgresql CloudSQL实例

时间:2019-05-29 14:50:40

标签: postgresql google-compute-engine gcloud

当尝试使用 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

因此,按照我拥有的文档进行操作

  1. 启用了CloudSQL并按照我的评论进行工作
  2. 已安装代理
  3. 我已经按照文档中的说明使用Cloud SQL Admin角色创建了一个服务帐户,如下所示:
{
  "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"
}
  1. 我成功地启动了 cloud_sql_proxy ,如下所示:
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
  1. 最后,我如下启动 psql 客户端:
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消息上没有连接被拒绝。

我不知道是谁在阻止那个流量...

4 个答案:

答案 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。

查看herehere了解更多详细信息。

我希望这会有所帮助。

答案 3 :(得分:0)

无论听起来多么微不足道,对我来说,Kubernetes部署文件中的CloudSQL代理映像从gcr.io/cloudsql-docker/gce-proxy:1.05gcr.io/cloudsql-docker/gce-proxy:latest *的更新解决了这个问题。

考虑到问题作者的最终评论,我相信这可能是CloudSQL的错误,需要您触发一些将完全重新启动其实例的操作。但这只是猜测。


*我在版本1.16上尝试过此操作。如果不确定期货发行的稳定性,可以指定版本而不是latest标签。