首页 > 解决方案 > 无法从 Cloud Run 连接到 Google Cloud SQL - 使用 R Shiny

问题描述

我创建了一个连接到 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 中的日志,我看到的错误消息如下:

警告:错误:无法为签名 '"character"、"character"' 找到函数 '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,但我可能不明白它是如何运作的。任何解释将不胜感激。

非常感谢!

标签: rpostgresqlshinygoogle-cloud-sqlshiny-server

解决方案


我通过添加 0.0.0.0/0 作为允许的网络向所有 IP 开放。

从安全的角度来看,这是一个可怕的、可怕的、不是好主意。这实质上意味着整个世界都可以尝试连接到您的数据库。

正如@john-hanley 在评论中所说,将Cloud Run 连接到 Cloud SQL 文档详细说明了如何连接。有两种选择:

  1. 通过使用 Unix 域套接字的公共 IP(互联网)/cloudsql/CLOUD_SQL_CONNECTION_NAME
  2. 通过私有 IP,它使用无服务器 VPC 访问通过 VPC 连接

如果您的库不支持 Unix 域套接字,则必须使用其他库或选择选项 2 并通过 TCP 连接。请注意,无服务器 VPC 访问连接器会产生与使用它相关的额外费用。


推荐阅读