连接到 postgresql CloudSQL 实例时出现奇怪的 googleapi Err 400 消息

Wil*_*ñez 5 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"
}
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 最后我按如下方式启动psql客户端:
psql "host=127.0.0.1 port=15432 sslmode=disable dbname=db1 user=dbuser"
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

在客户端,我得到:

psql: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
Run Code Online (Sandbox Code Playgroud)

在这一点上,我应该成功连接我的psql客户端,但我在网上或谷歌的文档中找不到任何关于此错误的信息

我不知道我需要在哪里设置项目参数,我尝试了一些疯狂的地方,比如在 psql 端使用-v或使用 url 与? 在没有运气结束,我也尝试过使用的cloud_sql_proxy侧-projects标志,也没有运气。


编辑:新发现!!!

我想我已经接近解决这个问题了,我做的第一个设置(如上所述)是在我在家使用的 Windows 电脑上,今天我在办公室,我决定使用 macos 复制所有这些,我不要认为操作系统根本不重要,有趣的是我复制了所有内容并创建了一个让我前进的小东西

所以,我再次开始并执行点 1., 2., 3., 4. 然后等待?文档指出实例字符串如下:myproject:us-central1:myinstance不是我最初写的,所以我改变了它并开始出现更合理的错误:

我开始cloud_sql_proxypsql建立连接并得到这个:

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
Run Code Online (Sandbox Code Playgroud)

我的 db1 实例只有私有 IP 10.26.112.3

我开始在互联网上寻找该错误,并找到了一个允许传入流量到 3307 端口的建议:

无法通过 Cloud Shell By Proxy 通过 Cloud SQL 代理连接 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
Run Code Online (Sandbox Code Playgroud)

但这没有任何区别,因为在那之后我仍然收到相同的错误消息:(


编辑:来自同一项目的虚拟机

我在该项目上创建了一个 VM 并复制了所有这些,我能够连接,端口 3307 消息上没有拒绝连接。

我不知道是谁在阻止那条交通……

Kin*_*ejo 5

感谢您向我们通报您的最新发现。我遇到了同样的问题。我刚刚解决了它\xe2\x80\x94你的第一次编辑给了我提示。

\n\n

在遵循 google CloudSQL 文档流程从外部应用程序连接到 CloudSQL 时,我启动了代理,如下所示:

\n\n
`./cloud_sql_proxy -instances=<instance_name>=tcp:5433`\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不让我连接。我收到这个错误

\n\n
`couldn\'t connect to "xxxxxxx": googleapi: Error 400: Missing parameter: project., required`\n
Run Code Online (Sandbox Code Playgroud)\n\n

阅读您的编辑后,我修改了命令以使用实例详细信息页面上所述的整个实例名称,并且它有效。这是让它工作的新命令。

\n\n
`./cloud_sql_proxy -instances=myproject:us-central1:instancename=tcp:5433`\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望这可以为某人节省几个小时。

\n


Wil*_*ñez 0

好吧,显然,如果您的数据库实例只有一个私有 IP地址,则cloud_sql_proxy不起作用,我必须添加一个公共 IP 地址,以便代理服务器可以访问我的实例。

\n\n

我了解某些限制,但如果 Google 提供cloud_sql_proxy它应该支持所有客户案例,我的意思是,我\xc2\xb4m 使用默认网络,该网络由 google 管理,网络应该允许代理服务器以某种方式到达我的数据库实例.. 我不知道 ...

\n\n

我在它开始工作的那一刻添加了公共IP ...但老实说,我不希望我的数据库实例上有公共IP。

\n