【发布时间】:2020-10-18 00:36:25
【问题描述】:
我在 Google Cloud 中部署了一个 PostgreSQL 数据库,我正在尝试从 Cloud Run 实例连接到该数据库。我尝试了以下两个包,它们最终都导致了相同的异常:
我得到的例外是:
SocketException: Failed host lookup: '/cloudsql/{INSTANCE_CONNECTION_NAME}' (OS Error: Name or service not known, errno = -2)
我在尝试建立连接时两次都到这里,所以在第一个包的情况下:
connection = new PostgreSQLConnection(
'/cloudsql/{INSTANCE_CONNECTION_NAME}',
5432,
'postgres',
username: 'username',
password: 'password');
await connection.open(); // <-- exception thrown here
我已尝试将主机字符串更改为/cloudsql/INSTANCE_CONNECTION_NAME}/.s.PGSQL.5432,但没有成功。我的第一个想法是权限,Cloud Run 实例正在使用的服务帐户 (xxx-compute@developer.gserviceaccount.com) 具有 Cloud SQL Editor 角色(也尝试过 Client 和 Admin)。
从 dart 控制台应用程序在本地运行相同的数据库代码,我可以通过它的公共 IP 地址连接到我的数据库作为具有两个包的主机,因此数据库本身已启动并运行。
有人能指出这个例外的正确方向吗/有上面任何包的示例代码,以显示如何将它连接到 Cloud Run 中的 Cloud SQL 实例?
编辑: 我尝试在本地设置代理以测试连接是否错误,如下所示:
.\cloud_sql_proxy.exe -instances={INSTANCE_CONNECTION_NAME}=tcp:5433 psql
然后将代码中的连接主机值更改为localhost,将端口更改为5433。
令我惊讶的是它可以工作 - 所以从本地我似乎能够使用该连接字符串连接到数据库。但是,当我从 Cloud Run 实例中使用它时,它仍然不起作用。任何帮助表示赞赏!
【问题讨论】:
-
您使用的是完全托管的 Cloud Run 吗?如果是这样,我认为链接对您有帮助cloud.google.com/sql/docs/postgres/connect-run
-
是的,完全托管。这是我正在关注的文件,是的......太糟糕了,他们没有飞镖样本。我认为我已正确完成所有步骤,但会仔细检查。
-
也许我理解错了,但
PostgreSQLConnection()的第一个参数不是主机(ip/dns)吗?而且据我所知,这样的主机不能以“/”开头。 -
确实是主机,所以应该是IP/DNS名称。我正在查看上面评论中发布的@SamuelRomero 文档中的示例,这就是我想到像这样放置主机的地方。那么正确的主机应该是什么?我应该删除领先的
/还是应该输入一个IP?
标签: postgresql dart google-cloud-sql google-cloud-run