将 hasura 与 Google Cloud 运行 和 Google Cloud SQL 一起使用

Use hasura with Google Cloud Run and Google Cloud SQL

文档描述 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 云 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 的直接连接-云-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>

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

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

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

Cloud SQLProxy 是用 Go 编写的,源代码已发布。

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

根据 v1.0.0-beta.8,它对 Postgres 连接字符串参数有更好的支持,我设法使 unix 连接正常工作,来自 Cloud 运行 Cloud SQL,没有将代理嵌入到容器中。

连接应如下所示:

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

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

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