r - 无法从 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,但我可能不明白它是如何运作的。任何解释将不胜感激。
非常感谢!
解决方案
我通过添加 0.0.0.0/0 作为允许的网络向所有 IP 开放。
从安全的角度来看,这是一个可怕的、可怕的、不是好主意。这实质上意味着整个世界都可以尝试连接到您的数据库。
正如@john-hanley 在评论中所说,将Cloud Run 连接到 Cloud SQL 文档详细说明了如何连接。有两种选择:
- 通过使用 Unix 域套接字的公共 IP(互联网)
/cloudsql/CLOUD_SQL_CONNECTION_NAME
- 通过私有 IP,它使用无服务器 VPC 访问通过 VPC 连接
如果您的库不支持 Unix 域套接字,则必须使用其他库或选择选项 2 并通过 TCP 连接。请注意,无服务器 VPC 访问连接器会产生与使用它相关的额外费用。
推荐阅读
- android - Android Studio Room & DAO:无法捕获 SQLiteDatabaseCorruptException
- javascript - 在访问不同类的实例方法时没有得到一个函数
- sql - 以下场景的输出
- php - JQUERY & 选择框不更新数据库
- c# - 用户应该能够重置自动增量(身份)列:可能的解决方案
- python - 如何保持 FTP 连接处于活动状态?
- java - JAXB XMLAdapter:有没有办法将此方法转换为 JAXB XmlAdapter
- javascript - 如何选择父级具有特定类的所有子级旁边的所有元素?
- libgpiod - 在 Linux 中使用 libgpiod 获取 gpio 输出的值
- python - 返回列中单词的频率及其关联的行