【问题标题】:How do you specify DB_URI postgres DB connection string to instance running in Google Sql cloud?如何将 DB_URI postgres DB 连接字符串指定到在 Google Sql 云中运行的实例?
【发布时间】:2020-02-08 09:06:28
【问题描述】:

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

【问题讨论】:

    标签: postgresql google-cloud-platform google-cloud-sql google-cloud-run postgrest


    【解决方案1】:

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

    通过遵循the documentation provided by the 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 documentation 中提到了两件重要的事情:

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

    在我的例子中,我使用的程序已经添加了后缀.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】:

    Cloud Run 不支持使用 IP 地址连接到 Cloud SQL。这意味着127.0.0.1 将不起作用。 Cloud Run 使用 Unix 套接字。您必须使用连接字符串。

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

    myprojectid:region:myinstanceid

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

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

    【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2021-09-08
      • 2021-10-04
      • 1970-01-01
      • 2018-09-17
      相关资源
      最近更新 更多