文档描述了 hasura 需要带有HASURA_GRAPHQL_DATABASE_URL
env var 的 postgres 连接字符串。
例:
docker run -d -p 8080:8080
-e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@hostname:port/dbname
hasura/graphql-engine:latest
看起来我的问题是谷歌云sql的服务器实例连接名称看起来像PROJECT_ID:REGION:INSTANCE_ID
不是TCP
从云运行文档 (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
我的完整云运行命令:
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>
根据 v1.0.0-beta.8,它对 Postgres 连接字符串参数有更好的支持,我已经设法使 unix 连接工作,从云运行到云 SQL,而无需将代理嵌入到容器中。
连接应如下所示:
postgres://<user>:<password>@/<database>?host=/cloudsql/<instance_name>
请注意,客户端将为您添加后缀/.s.PGSQL.5432
。
请确保还添加了云 SQL 客户端权限。
如果 Hasura 数据库需要确切的连接字符串格式,则可以使用它。但是,您不能使用Cloud Run的Cloud SQL支持。您需要将整个互联网列入白名单,以便您的 Cloud Run 实例可以连接。云运行不会发布 CIDR 地址块。不建议使用此方法。
Unix Socket 方法适用于 Cloud Run 支持的 Cloud SQL Proxy。这是在 Cloud Run 管理与云 SQL 的连接时,容器内部使用的连接方法。请注意,对于此方法,客户端不支持基于 IP 的主机名连接到 Cloud Run 的云 SQL 代理。
可以将云 SQL 代理直接嵌入到容器中。然后,可以使用 127.0.0.1 作为连接字符串的主机名部分。这将要求您创建一个 shell 脚本作为 Cloud Run 入口点,以启动代理和应用程序。根据您的方案,我推荐此方法。
云 SQL 代理是用 Go 编写的,源代码是发布的。
如果选择嵌入代理,请不要忘记将云 SQL 客户端角色添加到云运行服务帐户。