如何在运行于Google Sql云中的实例中指定DB_URI postgres数据库连接字符串?

5
这是我的情境。我已经在Google SQL云上设置了一个运行中的Postgres数据库实例,如果我将本地IP添加到白名单中,我可以直接连接并运行没有问题。
然后,我部署了一个docker容器(postGrest),它是一个web服务器,用于连接postgres数据库。当我在Google Cloud Run上进行配置时,有一个下拉选项,我可以在其中指定数据库连接,它说,在幕后,它会为该连接配置Cloud SQL代理。
该容器允许传递环境变量来指定哪个服务器等等。其中一个必需参数是DB_URI到postgred实例。在本地运行时,它看起来像这样: postgres://authenticator:mysecretpassword@localhost:5432/testdb
当我尝试在云版本上进行配置时,我尝试使用IP 127.0.0.1(谷歌云SQL代理文档说这就是通过代理连接的方法)。但这不起作用。
然后我尝试使用分配给postgres数据库的公共IP……这也不起作用。
有人知道如何使用这种DB_URI格式来指定正确的连接字符串吗?
3个回答

8

为了增加可读性并帮助其他用户,我将把这个内容作为答案添加,而不是一个评论。请不要鼓励更改被接受的答案。

按照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。

在我的情况下,我正在使用的程序已经将后缀.s.PGSQL.5432添加了,因此我不需要将其添加到我的URI中。

  1. 警告:基于Linux的操作系统最大套接字路径长度为107个字符。如果路径总长度超过此长度,则无法从Cloud Run(完全托管)连接套接字。

你真是个圣人。感谢您添加这个。在找到这个解决方案之前,我一直在抓狂。 - Kevin Won
2
在 Scala 应用程序中连接数据库,这是我的连接字符串:jdbc:postgresql:///my-db-name?host=/cloudsql/my-project-id:us-west1:my-postgres-instance-name(请注意,我通过我的数据库 API 提供 id/pw 参数而不是通过连接字符串提供,它可以正常工作)。 - Kevin Won
直到我启用了“sqladmin.googleapis.com”,我才能从App Engine连接。 - Joseph Connolly

1
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客户端权限。

谢谢,那就是问题所在了。我也发现这份关于PostgreSQL连接字符串的文档非常有帮助:https://www.postgresql.org/docs/9.3/libpq-connect.html - mike hennessy

0

似乎有些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套接字的路径作为主机名,编码/:字符。如果主机名的第一个字符是/,那么主机名将被视为文件系统路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接