我创建了一个连接到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 Run和Cloud SQL吗?或者我可以通过上面的dbConnect方法进行连接吗?我认为0.0.0.0/0也会包括云运行IP,但我可能不明白它是如何运行的。如有任何解释,我们将不胜感激。
非常感谢!
我已经通过添加0.0.0.0/0作为允许的网络向所有IP开放。
从安全角度来看,这是一个可怕的、可怕的、不好的主意。它本质上意味着整个世界都可以尝试连接到您的数据库。
正如@johnhanley在评论中所说,"连接云运行到云SQL"文档详细介绍了如何连接。有两种选择:
- 通过公共IP(互联网(使用
/cloudsql/CLOUD_SQL_CONNECTION_NAME
上的Unix域套接字 - 通过私有IP,使用无服务器VPC访问通过VPC连接
如果您的库不支持Unix域套接字,则必须使用其他库或选择选项2并通过TCP连接。请注意,无服务器VPC接入连接器的使用会产生额外的成本。