3

这是我的场景。我已经设置了一个在 Google SQL 云中运行的 Postgres DB 实例。它已启动并正在运行,如果我将本地 IP 列入白名单,我可以直接连接而不会出现问题。

然后我部署了一个 docker 容器(postGrest),它是一个连接到 postgres 数据库的 Web 服务器。当我在 Google Cloud Run 上配置它时,它确实有一个下拉选项,我可以在其中指定数据库连接,它说,在幕后,它为此连接配置 Cloud SQL 代理。

容器允许传入环境变量以指定哪个服务器等。一个必需的参数是 postgred 实例的 DB_URI。在本地运行时,它看起来像这样:

postgres://authenticator:mysecretpassword@localhost:5432/testdb

当我尝试在云版本上配置它时,我尝试使用 IP 127.0.0.1(谷歌云 SQL 代理文档说这是您通过代理连接的方式)。这没有用。

然后我尝试使用分配给 postgres 数据库的公共 IP ......这也不起作用。

有谁知道如何使用这种 DB_URI 格式指定正确的连接字符串?

4

3 回答 3

5

我只是将其添加为答案而不是评论,因为它更易于阅读并且可能有助于其他用户。请不要感到鼓励更改已接受的答案。

通过遵循OP 提供的文档,URI 的最终模式变为:

# Breaking lines for improved readability

POSTGRESS_URI=postgresql:///dbname
  ?host=/cloudsql/myprojectid:region:myinstanceid
  &user=username
  &password=password
  &sslmode=disable

* 不要忘记为 unix 套接字路径添加前缀/cloudsql/

任何参数都可以正常使用,如sslmode.

另外,请注意Cloud SQL 文档中提到了两件重要的事情:

  1. 注意:PostgreSQL 标准要求套接字路径中有 .s.PGSQL.5432 后缀。一些库自动应用此后缀,但其他库要求您指定套接字路径,如下所示:/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432。

就我而言,我正在使用的程序已经添加为 suffix .s.PGSQL.5432,所以我不需要将它添加到我的 URI 中。

  1. 警告:基于 Linux 的操作系统的最大套接字路径长度为 107 个字符。如果路径的总长度超过此长度,您将无法从 Cloud Run(完全托管)连接到套接字。
于 2020-10-12T10:17:03.437 回答
1

Cloud Run 不支持使用 IP 地址连接到 Cloud SQL。这种手段是127.0.0.1行不通的。Cloud Run 使用 Unix 套接字。您必须使用连接字符串。

Cloud SQL 代理连接字符串如下所示:

myprojectid:region:myinstanceid

您可以instanceid从控制台中的 Cloud SQL 实例详细信息页面获取。

您还需要向您的 Cloud Run 服务帐号添加访问 Cloud SQL 的权限。你至少需要Cloud SQL Client.

于 2019-10-10T21:52:55.717 回答
0

似乎某些 postgres 客户端库不支持将用户和密码参数放在 URL 查询参数中。我在使用pqNode.js 时遇到了问题,并且会收到错误“启动数据包中没有指定 PostgreSQL 用户名”。

编写连接字符串的另一种方法如下:

Breaking lines for readability:

postgres://db_user:db_password@
    %2Fcloudsql%2Fproj_name%3Aus-central1%3Asql_instance_name
    /db_name&sslmode=disable

它就像一个普通的 TCP 连接字符串,但是你将 Unix 套接字的路径作为主机,对/:字符进行编码。如果主机名的第一个字符是/,那么主机名将被视为文件系统路径。

于 2021-08-23T02:02:49.390 回答