4

文档描述了 hasura 需要带有 HASURA_GRAPHQL_DATABASE_URLenv 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>
4

2 回答 2

4

根据v1.0.0-beta.8,它对 Postgres 连接字符串参数有更好的支持,我已经设法使从 Cloud Run 到 Cloud SQL 的 unix 连接正常工作,而无需将代理嵌入到容器中。

连接应如下所示:

postgres://<user>:<password>@/<database>?host=/cloudsql/<instance_name>

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

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

于 2019-10-22T22:26:52.553 回答
2

如果 Hasura 数据库需要准确的连接字符串格式,您可以使用它。但是,您不能使用 Cloud Run 的 Cloud SQL 支持。您需要将整个互联网列入白名单,以便您的 Cloud Run 实例可以连接。Cloud Run 不会发布地址的 CIDR 块。不推荐这种方法。

Unix Socket 方法适用于 Cloud Run 支持的 Cloud SQL Proxy。这是 Cloud Run 管理与 Cloud SQL 的连接时在容器内部使用的连接方法。请注意,对于此方法,您的客户端不支持基于 IP 的主机名连接到 Cloud Run 的 Cloud SQL 代理。

您可以将 Cloud SQL 代理直接嵌入到您的容器中。然后您可以使用 127.0.0.1 作为连接字符串的主机名部分。这将要求您创建一个 shell 脚本作为 Cloud Run 入口点来启动代理和您的应用程序。根据您的情况,我推荐这种方法。

Cloud SQL Proxy 是用 Go 编写的,并且已经发布了源代码。

如果您选择嵌入代理,请不要忘记将 Cloud SQL 客户端角色添加到 Cloud Run 服务帐号。

于 2019-10-14T04:01:34.590 回答