使用Hasura与Google Cloud Run和Google Cloud SQL

5
文档表明,Hasura需要使用HASURA_GRAPHQL_DATABASE_URL环境变量设置Postgres连接字符串。
例如:
docker run -d -p 8080:8080 \
  -e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@hostname:port/dbname \
  hasura/graphql-engine:latest

看起来我的问题是,Google Cloud SQL 的服务器实例连接名称类似于 PROJECT_ID:REGION:INSTANCE_ID,但它不是 TCP。从 Cloud Run 文档(https://cloud.google.com/sql/docs/postgres/connect-run)中,我得到了以下示例:postgres://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432,但它似乎不起作用。有什么想法吗?
我目前正在向容器添加 cloud_sql_proxy 作为解决方法,以便我可以连接到 TCP 127.0.0.1:5432,但我正在寻找与 Google Cloud SQL 的直接连接。
// 编辑感谢评论,beta8 大部分做到了,但我也错过了 set-cloudsql-instances 参数: https://cloud.google.com/sdk/gcloud/reference/beta/run/deploy#--set-cloudsql-instances 完整的 Cloud Run 命令:
gcloud beta run deploy \
    --image gcr.io/<PROJECT_ID>/graphql-server:latest \
    --region <CLOUD_RUN_REGION> \
    --platform managed \
    --set-env-vars HASURA_GRAPHQL_DATABASE_URL="postgres://<DB_USER>:<DB_PASS>@/<DB_NAME>?host=/cloudsql/<PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>" \
    --timeout 900 \
    --set-cloudsql-instances <PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>
2个回答

5
根据 v1.0.0-beta.8 的更新,支持更好的Postgres连接字符串参数。我成功地实现了从Cloud Run到Cloud SQL的Unix连接,而不需要将代理嵌入容器中。
连接应该类似于这样:
postgres://<user>:<password>@/<database>?host=/cloudsql/<instance_name>

请注意,客户端将为您添加后缀/.s.PGSQL.5432

确保您还添加了Cloud SQL客户端权限。


我收到了这个错误:{code: postgres-error, error: connection error, internal: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/cloudsql/<instance_name>/.s.PGSQL.5432"? , path: $} - 实例名称应该是正确的。有什么想法吗?我已经添加了 Cloud SQL 权限。 - wiesson
1
我会创建一个仓库来重现问题,然后我们可以从那里讨论。明天我完成后会在这里更新。 - Matheus Schettino
寻找这种解决方案已经好几周了!谢谢 :) - David Oliveira
如何使用此解决方案的更多详细信息,请参阅此存储库:https://github.com/n3n/hasura-cloud-run - Karol Zlot

3
如果Hasura数据库需要精确的连接字符串格式,您可以使用它。但是,您不能使用Cloud Run的Cloud SQL支持。您需要将整个互联网列入白名单,以便您的Cloud Run实例可以连接。Cloud Run不发布地址的CIDR块。此方法不建议使用。
Unix套接字方法适用于Cloud Run支持的Cloud SQL代理。这是当Cloud Run管理与Cloud SQL的连接时,在容器内部使用的连接方法。注意,在此方法中,不支持基于IP的主机名用于连接到Cloud Run的Cloud SQL代理的客户端。
您可以直接在您的容器中嵌入Cloud SQL代理。然后,您可以使用127.0.0.1作为连接字符串的主机名部分。这将需要您创建一个shell脚本作为Cloud Run入口点来启动代理和应用程序。根据您的情况,我推荐使用此方法。
Cloud SQL代理是用Go编写的,并且源代码已发布。
如果选择嵌入代理,请不要忘记将Cloud SQL客户端角色添加到Cloud Run服务帐户中。

目前最新版本不需要使用Cloud SQL代理。 - Karol Zlot

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