You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Google Cloud Run连接非GCP外部PostgreSQL数据库的问题问询

Cloud Run部署R Shiny应用访问外部PostgreSQL数据库问题及解决方案

问题背景

我有一台部署在GCP外部服务器上的PostgreSQL数据库,另有一个R Shiny应用打包为Docker容器通过Google Cloud Run部署,需要访问该外部PostgreSQL数据库。R Shiny Docker容器在本地Docker Desktop运行时可正常连接数据库,也可通过用户名密码直接登录PostgreSQL数据库,无任何报错。但部署到Google Cloud Run后运行时抛出如下错误:

Warning: Error in postgresqlNewConnection: RS-DBI driver: (could not connect xxxx@xxpostgresxx.client.ext:5432 on dbname "db_name": could not translate host name "xxpostgresxx.client.ext" to address: Name or service not known

.R文件中的数据库连接代码如下:

drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host = "xxx.xxx.ext", port = "5432", dbname = "db_name", user = "xxxx", password = "xxxx")

此前已尝试调整DBI和RPostgreSQL库的加载顺序,仍未解决问题,需要排查问题原因及获取操作指引。

问题原因排查

  • 排除RS-DBI驱动问题:本地Docker容器运行正常,说明代码、依赖包配置均无问题,驱动可正常工作
  • 报错核心为DNS解析失败:Cloud Run默认运行在Google托管的公共网络环境,默认无法解析私有网络域名,也无法直接访问未暴露到公网的私有网络资源
  • 如数据库已暴露到公网,则可能是数据库防火墙未放行Cloud Run出口IP的访问权限

解决方案操作指引

生产环境推荐使用Serverless VPC Access实现安全访问,操作步骤如下:

  1. 打通GCP VPC和私有网络
    先通过Cloud VPN或Cloud Interconnect将存放PostgreSQL的私有网络和GCP目标VPC打通,配置双向路由规则,确保VPC内资源可正常访问私有网络的5432端口,且私有DNS可在GCP VPC内正常解析。
  2. 创建Serverless VPC Access连接器
    • 进入GCP控制台的Serverless VPC Access页面,选择和Cloud Run同区域、和私有网络打通的VPC
    • 配置连接器的IP网段,网段不能和现有VPC、私有网络的网段冲突,例如可配置为10.8.0.0/28
    • 选择符合业务吞吐量需求的实例规格,提交创建
  3. 绑定Cloud Run服务到VPC连接器
    • 进入目标Cloud Run服务的编辑页面,展开「连接」配置项
    • 选择刚才创建的VPC连接器,路由规则选择「将所有流量路由通过VPC」,若仅用私有IP访问数据库可选择仅路由私有地址流量
    • 保存配置并部署新的修订版本
  4. 访问验证
    部署完成后访问Cloud Run服务,确认数据库连接正常。

如果是非生产场景测试使用,也可以将数据库暴露到公网,配置Cloud Run使用静态出口IP,将该IP加入PostgreSQL的访问白名单即可,但该方式安全性较低,不推荐生产使用。

问题更新

目前已通过配置Serverless VPC access实现了Cloud Run服务访问私有VPN内资源的需求,可正常连接数据库。

内容的提问来源于stack exchange,提问作者kfranz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:00:04