如何将 DB_URI postgres DB 连接字符串指定到 Google Sql 云中的实例 运行?
How do you specify DB_URI postgres DB connection string to instance running in Google Sql cloud?
这是我的场景。我已经在 Google SQL 云中设置了一个 Postgres DB 运行 实例。启动 运行 如果我将我的本地 IP 列入白名单,我可以直接连接没有问题。
然后我部署了一个 docker 容器 (postGrest),它是一个连接到 postgres 数据库的 Web 服务器。
当我在 Google Cloud 运行 上配置它时,它确实有一个下拉选项,我可以在其中指定数据库连接,它说,在幕后,它为 Cloud SQL Proxy 配置这个连接。
容器允许传入环境变量指定哪个服务器等。
一个必需的参数是 postgred 实例的 DB_URI。在本地 运行 时,它看起来像这样:
postgres://authenticator:mysecretpassword@localhost:5432/testdb
当我尝试在云版本上配置它时,我尝试使用 IP 127.0.0.1(google 云 SQL 代理文档说这是您通过代理连接的方式)。这没有用。
然后我尝试使用分配给 postgres 数据库的 public-ip....这也没有用。
有谁知道如何使用这种 DB_URI 格式指定正确的连接字符串?
云 运行 不支持使用 IP 地址连接到云 SQL。这意味着 127.0.0.1
将不起作用。云 运行 使用 Unix 套接字。您必须使用连接字符串。
云 SQL 代理连接字符串如下所示:
myprojectid:region:myinstanceid
您可以从控制台中的云 SQL 实例详细信息页面获取 instanceid
。
您还需要为您的 Cloud 运行 服务帐户添加权限才能访问 Cloud SQL。您至少需要 Cloud SQL Client
.
我只是将其添加为答案而不是评论,因为它更易于阅读并可能帮助其他用户。请不要鼓励更改已接受的答案。
按照 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 中提到了两件重要的事情:
- Note: The PostgreSQL standard requires a .s.PGSQL.5432 suffix in the socket path. Some libraries apply this suffix automatically, but others require you to specify the socket path as follows: /cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432.
就我而言,我使用的程序已经添加了后缀 .s.PGSQL.5432
,因此我不需要将其添加到我的 URI。
- Warning: Linux based operating systems have a maximum socket path length of 107 characters. If the total length of the path exceeds this length, you will not be able to connect with a socket from Cloud Run (fully managed).
似乎某些 postgres 客户端库不支持将用户和密码参数放在 URL 查询参数中。我在使用 pq
for Node.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 套接字的路径作为主机,对 /
和 :
字符进行编码。如果主机名的第一个字符是 /
,那么主机名将被视为文件系统路径。
这是我的场景。我已经在 Google SQL 云中设置了一个 Postgres DB 运行 实例。启动 运行 如果我将我的本地 IP 列入白名单,我可以直接连接没有问题。
然后我部署了一个 docker 容器 (postGrest),它是一个连接到 postgres 数据库的 Web 服务器。 当我在 Google Cloud 运行 上配置它时,它确实有一个下拉选项,我可以在其中指定数据库连接,它说,在幕后,它为 Cloud SQL Proxy 配置这个连接。
容器允许传入环境变量指定哪个服务器等。 一个必需的参数是 postgred 实例的 DB_URI。在本地 运行 时,它看起来像这样:
postgres://authenticator:mysecretpassword@localhost:5432/testdb
当我尝试在云版本上配置它时,我尝试使用 IP 127.0.0.1(google 云 SQL 代理文档说这是您通过代理连接的方式)。这没有用。
然后我尝试使用分配给 postgres 数据库的 public-ip....这也没有用。
有谁知道如何使用这种 DB_URI 格式指定正确的连接字符串?
云 运行 不支持使用 IP 地址连接到云 SQL。这意味着 127.0.0.1
将不起作用。云 运行 使用 Unix 套接字。您必须使用连接字符串。
云 SQL 代理连接字符串如下所示:
myprojectid:region:myinstanceid
您可以从控制台中的云 SQL 实例详细信息页面获取 instanceid
。
您还需要为您的 Cloud 运行 服务帐户添加权限才能访问 Cloud SQL。您至少需要 Cloud SQL Client
.
我只是将其添加为答案而不是评论,因为它更易于阅读并可能帮助其他用户。请不要鼓励更改已接受的答案。
按照 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 中提到了两件重要的事情:
- Note: The PostgreSQL standard requires a .s.PGSQL.5432 suffix in the socket path. Some libraries apply this suffix automatically, but others require you to specify the socket path as follows: /cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432.
就我而言,我使用的程序已经添加了后缀 .s.PGSQL.5432
,因此我不需要将其添加到我的 URI。
- Warning: Linux based operating systems have a maximum socket path length of 107 characters. If the total length of the path exceeds this length, you will not be able to connect with a socket from Cloud Run (fully managed).
似乎某些 postgres 客户端库不支持将用户和密码参数放在 URL 查询参数中。我在使用 pq
for Node.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 套接字的路径作为主机,对 /
和 :
字符进行编码。如果主机名的第一个字符是 /
,那么主机名将被视为文件系统路径。