如何授予 AI Platform 训练作业对同一项目中 Cloud SQL 资源的访问权限?
How can I grant AI Platform training jobs access to Cloud SQL resources in the same project?
我有一张图片可以 运行 我的训练作业。训练数据在 Cloud SQL 数据库中。当我在本地机器上 运行 cloud_sql_proxy 时,容器可以正常连接。
❯ docker run --rm us.gcr.io/myproject/trainer:latest mysql -uroot -h"'172.17.0.2'" -e"'show databases;'"
Running: `mysql -uroot -h'172.17.0.2' -e'show databases;'`
Database
information_schema
mytrainingdatagoeshere
mysql
performance_schema
我使用 mysql
只是为了测试连接,实际的训练命令在容器的其他地方。当我通过 AI 平台尝试此操作时,无法连接。
❯ gcloud ai-platform jobs submit training firsttry3 \
--region us-west2 \
--master-image-uri us.gcr.io/myproject/trainer:latest \
-- \
mysql -uroot -h"'34.94.1.2'" -e"'show tables;'"
Job [firsttry3] submitted successfully.
Your job is still active. You may view the status of your job with the command
$ gcloud ai-platform jobs describe firsttry3
or continue streaming the logs with the command
$ gcloud ai-platform jobs stream-logs firsttry3
jobId: firsttry3
state: QUEUED
❯ gcloud ai-platform jobs stream-logs firsttry3
INFO 2019-12-16 22:58:23 -0700 service Validating job requirements...
INFO 2019-12-16 22:58:23 -0700 service Job creation request has been successfully validated.
INFO 2019-12-16 22:58:23 -0700 service Job firsttry3 is queued.
INFO 2019-12-16 22:58:24 -0700 service Waiting for job to be provisioned.
INFO 2019-12-16 22:58:26 -0700 service Waiting for training program to start.
ERROR 2019-12-16 22:59:32 -0700 master-replica-0 Entered Slicetool Container
ERROR 2019-12-16 22:59:32 -0700 master-replica-0 Running: `mysql -uroot -h'34.94.1.2' -e'show tables;'`
ERROR 2019-12-16 23:01:44 -0700 master-replica-0 ERROR 2003 (HY000): Can't connect to MySQL server on '34.94.1.2'
似乎无法从作业获得的任何地方访问主机 运行。 如何授予 AI 平台访问云的权限 Sql?
我考虑过在训练容器中包含云 sql 代理,然后将服务帐户凭据作为用户参数注入,但由于它们都在同一个项目中,我希望不会有需要这一步。这些希望是不是落空了?
很遗憾,并非所有 Cloud 产品都被沙盒化到同一网络中,因此您将无法在产品之间自动连接。因此,您遇到的问题是 AI Platform 无法自动访问 34.xx.x.x IP 地址的 Cloud SQL 实例。
您可以通过多种方法来修复它,但需要注意的是,我不太了解 AI Platform 的网络设置(我将不得不这样做并很快在这里写博客)。首先,您可以尝试看看是否可以将 AI Platform 连接到 VPC(虚拟私有云)网络,并将您的 Cloud SQL 实例放入同一个 VPC。这将允许他们通过私有 IP(可能与您现在拥有的 IP 不同)相互交谈。在云 SQL 实例的连接详细信息中,您应该看到您是否有私有 IP,如果没有,您可以在实例设置中启用它(需要关闭并重新启动)。否则,您可以确定设置了 Public IP 地址,这可能是 34.xx.x.x IP,然后是白名单(白名单,但我正在尝试更改术语)AI 的 Cloud IP 地址平台。
您可以在此处了解 GCP 处理 IP 范围的方式:https://cloud.google.com/compute/docs/ip-addresses/
将这些范围添加到云端授权网络后 SQL 连接设置,您应该能够直接从 AI Platform 连接。
原回复:
当您尝试从 AI 平台连接时,代理 运行ning 在哪里?还在你的本地机器上吗?所以基本上,在场景 1 中,您 运行 在本地使用 docker 运行 连接容器,并连接到您的本地 IP:172.17.0.2,然后当您转移到AI 平台,您要连接到位于 34.xx.x.x 的本地机器吗?
所以首先,您可能想从您的原始问题中删除您的实际家庭 IP 地址。人们在互联网上很粗鲁,如果那真的是你的家庭 IP,那结果可能会很糟糕。
其次,您是否确定已在防火墙中打开一个漏洞以允许来自 AI 平台的流量进入?一般来说,这就是我认为问题所在,您在本地计算机上的连接被拒绝,导致的错误是无法连接。
这是我在不需要 VPC 对等或单独代理的情况下完全通过我的 Python 项目完成的方法。
我在我的自定义容器中为 Python 驱动程序使用了云 SQL 连接器。 顺便说一句,我建议使用连接器作为默认方法连接到应用程序中的 Cloud SQL 实例,因为它抽象了跨环境的连接详细信息。您只需要确保您的环境具有正确的应用程序默认凭据即可连接。无需代理。
运行 使用我创建的自定义服务帐户的作业,其中包括 Cloud SQL Client 以及自定义版本的Platform AI Service Agent 将 iam.serviceAccounts.actAs 权限添加到此处指定的角色。 https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig
您无法通过 UI 启动使用自定义服务帐户的作业,但您可以很容易地以编程方式执行此操作,从而使其更快且可配置性更高。示例代码:
from oauth2client.client import GoogleCredentials
from googleapiclient import discovery
from googleapiclient import errors
from time import time
project_name = YOUR_PROJECT
project_id = 'projects/{}'.format(project_name)
projectNumber = 1234 # retrieved via Google Cloud SDK Shell: gcloud projects describe YOUR_PROJECT --format="value(projectNumber)"
trainingInputs = {
"region": "us-east4",
"masterConfig": {
"imageUri": "gcr.io/my_project/my_image",
},
"serviceAccount":"****@your_project.iam.gserviceaccount.com"
}
# https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig
job = {
"jobId": f"TestJob_{int(time())}",
"labels": {
"custom_label":"label_value"
},
"trainingInput": trainingInputs
}
# https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs/create
cloudml = discovery.build('ml','v1')
request = cloudml.projects().jobs().create(body=job,
parent=project_id)
try:
response = request.execute()
# You can put your code for handling success (if any) here.
print(response)
except errors.HttpError as err:
print('There was an error creating the training job.'
' Check the details:')
print(err._get_reason())
我有一张图片可以 运行 我的训练作业。训练数据在 Cloud SQL 数据库中。当我在本地机器上 运行 cloud_sql_proxy 时,容器可以正常连接。
❯ docker run --rm us.gcr.io/myproject/trainer:latest mysql -uroot -h"'172.17.0.2'" -e"'show databases;'"
Running: `mysql -uroot -h'172.17.0.2' -e'show databases;'`
Database
information_schema
mytrainingdatagoeshere
mysql
performance_schema
我使用 mysql
只是为了测试连接,实际的训练命令在容器的其他地方。当我通过 AI 平台尝试此操作时,无法连接。
❯ gcloud ai-platform jobs submit training firsttry3 \
--region us-west2 \
--master-image-uri us.gcr.io/myproject/trainer:latest \
-- \
mysql -uroot -h"'34.94.1.2'" -e"'show tables;'"
Job [firsttry3] submitted successfully.
Your job is still active. You may view the status of your job with the command
$ gcloud ai-platform jobs describe firsttry3
or continue streaming the logs with the command
$ gcloud ai-platform jobs stream-logs firsttry3
jobId: firsttry3
state: QUEUED
❯ gcloud ai-platform jobs stream-logs firsttry3
INFO 2019-12-16 22:58:23 -0700 service Validating job requirements...
INFO 2019-12-16 22:58:23 -0700 service Job creation request has been successfully validated.
INFO 2019-12-16 22:58:23 -0700 service Job firsttry3 is queued.
INFO 2019-12-16 22:58:24 -0700 service Waiting for job to be provisioned.
INFO 2019-12-16 22:58:26 -0700 service Waiting for training program to start.
ERROR 2019-12-16 22:59:32 -0700 master-replica-0 Entered Slicetool Container
ERROR 2019-12-16 22:59:32 -0700 master-replica-0 Running: `mysql -uroot -h'34.94.1.2' -e'show tables;'`
ERROR 2019-12-16 23:01:44 -0700 master-replica-0 ERROR 2003 (HY000): Can't connect to MySQL server on '34.94.1.2'
似乎无法从作业获得的任何地方访问主机 运行。 如何授予 AI 平台访问云的权限 Sql?
我考虑过在训练容器中包含云 sql 代理,然后将服务帐户凭据作为用户参数注入,但由于它们都在同一个项目中,我希望不会有需要这一步。这些希望是不是落空了?
很遗憾,并非所有 Cloud 产品都被沙盒化到同一网络中,因此您将无法在产品之间自动连接。因此,您遇到的问题是 AI Platform 无法自动访问 34.xx.x.x IP 地址的 Cloud SQL 实例。
您可以通过多种方法来修复它,但需要注意的是,我不太了解 AI Platform 的网络设置(我将不得不这样做并很快在这里写博客)。首先,您可以尝试看看是否可以将 AI Platform 连接到 VPC(虚拟私有云)网络,并将您的 Cloud SQL 实例放入同一个 VPC。这将允许他们通过私有 IP(可能与您现在拥有的 IP 不同)相互交谈。在云 SQL 实例的连接详细信息中,您应该看到您是否有私有 IP,如果没有,您可以在实例设置中启用它(需要关闭并重新启动)。否则,您可以确定设置了 Public IP 地址,这可能是 34.xx.x.x IP,然后是白名单(白名单,但我正在尝试更改术语)AI 的 Cloud IP 地址平台。
您可以在此处了解 GCP 处理 IP 范围的方式:https://cloud.google.com/compute/docs/ip-addresses/
将这些范围添加到云端授权网络后 SQL 连接设置,您应该能够直接从 AI Platform 连接。
原回复:
当您尝试从 AI 平台连接时,代理 运行ning 在哪里?还在你的本地机器上吗?所以基本上,在场景 1 中,您 运行 在本地使用 docker 运行 连接容器,并连接到您的本地 IP:172.17.0.2,然后当您转移到AI 平台,您要连接到位于 34.xx.x.x 的本地机器吗? 所以首先,您可能想从您的原始问题中删除您的实际家庭 IP 地址。人们在互联网上很粗鲁,如果那真的是你的家庭 IP,那结果可能会很糟糕。 其次,您是否确定已在防火墙中打开一个漏洞以允许来自 AI 平台的流量进入?一般来说,这就是我认为问题所在,您在本地计算机上的连接被拒绝,导致的错误是无法连接。
这是我在不需要 VPC 对等或单独代理的情况下完全通过我的 Python 项目完成的方法。
我在我的自定义容器中为 Python 驱动程序使用了云 SQL 连接器。 顺便说一句,我建议使用连接器作为默认方法连接到应用程序中的 Cloud SQL 实例,因为它抽象了跨环境的连接详细信息。您只需要确保您的环境具有正确的应用程序默认凭据即可连接。无需代理。
运行 使用我创建的自定义服务帐户的作业,其中包括 Cloud SQL Client 以及自定义版本的Platform AI Service Agent 将 iam.serviceAccounts.actAs 权限添加到此处指定的角色。 https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig
您无法通过 UI 启动使用自定义服务帐户的作业,但您可以很容易地以编程方式执行此操作,从而使其更快且可配置性更高。示例代码:
from oauth2client.client import GoogleCredentials
from googleapiclient import discovery
from googleapiclient import errors
from time import time
project_name = YOUR_PROJECT
project_id = 'projects/{}'.format(project_name)
projectNumber = 1234 # retrieved via Google Cloud SDK Shell: gcloud projects describe YOUR_PROJECT --format="value(projectNumber)"
trainingInputs = {
"region": "us-east4",
"masterConfig": {
"imageUri": "gcr.io/my_project/my_image",
},
"serviceAccount":"****@your_project.iam.gserviceaccount.com"
}
# https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig
job = {
"jobId": f"TestJob_{int(time())}",
"labels": {
"custom_label":"label_value"
},
"trainingInput": trainingInputs
}
# https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs/create
cloudml = discovery.build('ml','v1')
request = cloudml.projects().jobs().create(body=job,
parent=project_id)
try:
response = request.execute()
# You can put your code for handling success (if any) here.
print(response)
except errors.HttpError as err:
print('There was an error creating the training job.'
' Check the details:')
print(err._get_reason())