【发布时间】:2021-08-10 04:50:18
【问题描述】:
我创建了一个连接到 Cloud SQL 实例的 R Shiny 应用程序。它在我的本地服务器上运行良好,但是当我通过 Dockerfile 上传到 shinyapps.io 或 Cloud Run 时,它无法连接。
这是我使用 RPostgres 包连接的代码:
conn <- dbConnect(
drv=RPostgres::Postgres(),
dbname='postgres',
sslrootcert=path to 'server-ca.pem',
sslcert=path to 'client-cert.pem',
sslkey=path to 'client-key.pem',
host='xxxxxxxxxxxxxxxxxxx',
port=5432,
user='username',
password='password_string',
sslmode='verify-ca')
我检查了 Cloud Run 中的日志,我看到的错误消息如下:
警告:错误:无法找到用于签名“字符”、“字符”的函数“dbGetQuery”的继承方法
dbGetQuery() 函数在 dbConnect 函数之后调用,并且由于它在我的本地服务器上运行良好,因此我相当有信心看到的是连接问题,而不是包命名空间问题。但可能是错误的。
通过添加 0.0.0.0/0 作为允许的网络,我已向所有 IP 开放。奇怪的是,有时我可以从 shinyapps.io 连接,但大多数时候它都失败了。我还没有从 Cloud Run 让它工作一次。这让我认为这可能是动态 IP 地址或类似的问题?
是否需要通过 Cloud Auth 代理才能在 Cloud Run 和 Cloud SQL 之间直接连接?或者我可以通过上面的 dbConnect 方法进行连接吗?我认为 0.0.0.0/0 也将包括 Cloud Run IP,但我可能不明白它是如何运作的。任何解释将不胜感激。
非常感谢!
【问题讨论】:
-
连接成功了吗?您已经屏蔽了连接主机,但我猜您正在尝试使用 IP。 SSL 证书包含实例名称而不是 IP 地址。这意味着您无法为基于 IP 的连接启用 SSL 验证。如果您在 Cloud Run 中使用 Unix 套接字,则根本不需要 SSL 设置,因为 SQL 代理会为您加密。遵循 Cloud Run 文档并使用使用代理连接和删除 SSL 部分的 SQL 实例名称(Unix 套接字)。
-
我不明白的是,使用代理后如何获取连接? IE。如何将它传递给我的代码中的“conn”对象(见问题)?从你的意思来看,我想我只需要将 SQL 实例名称传递给主机参数?
-
代理运行隐藏在您的 Cloud Run 容器中。使用 Unix 套接字
/cloudsql/CLOUD_SQL_CONNECTION_NAME连接。连接名称在控制台中或通过 CLIgcloud instances list和gcloud instances describe列出。我不使用 R 编写代码,也不知道如何配置 RPostgres 以使用 Unix 套接字而不是 IP:PORT。查看此链接以从 Cloud Run 连接到 Cloud SQL:cloud.google.com/sql/docs/postgres/connect-run -
不幸的是,该方法似乎对我不起作用,看来 RPostgres 不接受来自您描述的 Unix 套接字的连接。这是否意味着我需要切换到私有 IP?这甚至意味着什么??
-
私有 IP 有更多限制。几个选项:1)将库切换到支持 Unix 套接字的库。 2) 使用公共 IP,将您的 IP 地址列入白名单并启用 SSL 连接。如果您选择私有 IP,那么您的客户端必须在您的 VPC 中,或者您必须使用 SQL 代理。
标签: r postgresql shiny google-cloud-sql shiny-server