如何将 AI Platform Training 作业连接到 Cloud SQL PSQL DB?

How to connect AI Platform Training job to Cloud SQL PSQL DB?

我有一个简单的 python 程序可以连接到 google 云平台上的 PSQL 数据库。当我在本地 运行 它通过主机地址(public IP)、端口、用户名和密码成功连接到数据库(仅当我手动告诉数据库允许我的本地 IP 地址时)。

当我将其打包在 Docker 图像中并在本地 运行 时,它连接成功(仅当我手动告诉数据库允许我的本地 IP 地址时)。

这是它失败的地方: 如果我停止告诉数据库允许我的本地 IP 地址,它将失败。

此外,在我将 docker 镜像推送到 google 云容器注册表之后。 然后使用ai-platform training job抓取容器并通过代码做一些事情:

gcloud ai-platform jobs submit training $JOB_NAME   --region $REGION   --master-image-uri $IMAGE_URI  --   app.py --user_arg='Y'

我通过标志与图像通信,我确信图像响应正确。但是,当我尝试连接到 PSQL 数据库时,出现错误:

psycopg2.OperationalError: could not connect to server: Connection timed out.
Is the server running on host ... and accepting TCP/IP connections on port ...?

我不想使用云sql代理来解决这个问题,也不想设置任何类型的静态IP并在数据库设置中手动“允许”它。

我想通过 IAM 服务器帐户促进连接。我为所有服务授予了以下权限: 云 SQL 管理员,云 SQL 编辑,云 SQL 客户端,云 SQL 实例用户,云 SQL 服务代理。

如您所知,我已尽我所能授予每个帐户权限,但它仍然无法连接。如有任何帮助,我们将不胜感激!

此外,当我调用 gcloud ai-platform jobs submit training 时...我知道某些服务帐户会创建一个实例来执行该作业。我认为是这个实例无法连接。我已经阅读了很多 gcloud 文档,但我感到困惑。也许我错过了一些明显的东西:(

当您 运行 使用 AI Platform 工作时,您 运行 它是无服务器的。不在您的项目中,而是在 Google 一侧,某处但不在您的项目中。因此,创建的 VM 不在您的项目中(您不会在 Compute Engine 页面中看到它们),因此不在您的 VPC 中。

所以,打开5432端口是完全没用的,因为不是同一个网络。唯一的解决办法是在你的数据库上保留一个 public IP(没有网络授权,只有 public IP)并使用云 SQL 代理(即使你不想要) .

当然还有一个解决办法就是把0.0.0.0/0网络授权到PSQL public IP上,但这绝对不是什么好建议!

但是,我要说一句:IMO 在训练工作中直接使用数据库不是正确的模式。事实上,在训练工作中,您需要速度、效率并减少延迟。使用数据库并不是很好。

正确的模式可能是

  • 之前准备好数据(从数据库中提取数据,并将其保存到文件中(例如 csv 格式))
  • 将文件存储在区域存储桶中(不是多区域,如果效率更高的话)
  • 更改您的训练作业以使用文件而不是 SQL 查询
  • 运行 您的培训工作与您的区域桶在同一区域。

请看一下这个功能:Using VPC Network Peering with Training