0

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

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

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

此外,在我将 docker 映像推送到谷歌云容器注册表之后。然后使用ai-platform训练作业抓取容器并通过代码做一些事情:

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

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

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 服务器帐户促进连接。我为所有服务授予以下权限:Cloud SQL Admin、Cloud SQL Editor、Cloud SQL Client、Cloud SQL Instance User、Cloud SQL Service Agent。

如您所知,我为每个帐户都授予了权限,但仍然无法连接。任何帮助,将不胜感激!

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

4

2 回答 2

2

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

所以,打开5432端口是完全没用的,因为它不是同一个网络。唯一的解决方案是在您的数据库上保留一个公共 IP(没有网络授权,只有公共 IP)并使用 Cloud SQL 代理(即使您不想要)。

当然,另一种解决方案是在 PSQL 公网 IP 上授权 0.0.0.0/0 网络,但这绝对不是一个好建议!

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

正确的模式可能是

  • 事先准备好数据(从数据库中提取数据,并将它们保存到文件中(例如 csv 格式))
  • 将文件存储在区域存储桶中(如果更有效,则不是多区域)
  • 更改您的训练作业以使用文件而不是 SQL 查询
  • 在与您的区域存储桶相同的区域中运行您的训练作业。
于 2020-10-03T12:04:18.800 回答
0

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

于 2020-10-14T06:04:00.050 回答