您如何指定 DB_URI postgres DB 连接字符串到在 Google Sql 云中运行的实例?

mik*_*ssy 3 postgresql google-cloud-sql google-cloud-platform postgrest google-cloud-run

这是我的场景。我已经设置了一个在 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 格式指定正确的连接字符串?

zan*_*ona 5

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

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

# Breaking lines for improved readability

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

Run Code Online (Sandbox Code Playgroud)

* 不要忘记在 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(全代管式)的套接字。

  • 在 scala 应用程序中连接,这是我有效的 conn 字符串: `jdbc:postgresql:///my-db-name?host=/cloudsql/my-project-id:us-west1:my-postgres-instance-name` (请注意,我通过 db api 而不是通过 conn 字符串提供 id/pw 参数,并且它有效)。 (2认同)

Joh*_*ley 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.