【问题标题】:Can't connect to Google Cloud SQL from Cloud Run - using R Shiny无法从 Cloud Run 连接到 Google Cloud SQL - 使用 R Shiny
【发布时间】: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 连接。连接名称在控制台中或通过 CLI gcloud instances listgcloud 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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我绝对知道有关此的警告。但是,我的理解是,只要查询是 SSL 加密的并且您有一个强密码,那么任何黑客在入侵您的系统之前都必须绕过至少 2 层安全性。它是否正确?我假设如果 Cloud SQL 将其作为一个选项提供,那么这个想法至少有一些优点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2021-07-18
  • 2021-12-25
  • 2022-11-10
  • 2020-02-23
  • 2019-09-16
  • 2020-06-15
相关资源
最近更新 更多