【问题标题】:How can I grant AI Platform training jobs access to Cloud SQL resources in the same project?如何授予 AI Platform 训练作业访问同一项目中 Cloud SQL 资源的权限?
【发布时间】:2019-12-17 06:36:08
【问题描述】:

我有一张图片可以运行我的训练工作。训练数据位于 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 Platform 尝试此操作时,我无法连接。

❯ 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 平台对 Cloud Sql 的访问权限?

我考虑在训练容器中包含云 sql 代理,然后将服务帐户凭据作为用户参数注入,但由于它们都在同一个项目中,我希望不需要这一步。这些希望是不是落空了?

【问题讨论】:

    标签: google-cloud-sql gcp-ai-platform-training


    【解决方案1】:

    很遗憾,并非所有云产品都被沙盒化到同一个网络中,因此您将无法在产品之间自动连接。因此,您遇到的问题是 AI Platform 无法自动访问位于 34.xx.x.x IP 地址的 Cloud SQL 实例。

    您可以通过几种方法来修复它,但需要注意的是,我不太了解 AI Platform 的网络设置(我必须尽快完成并在此处发布博客)。首先,您是否可以尝试查看是否可以将 AI Platform 连接到 VPC(虚拟私有云)网络,并将您的 Cloud SQL 实例放入同一个 VPC。这将允许他们通过私有 IP 相互交谈(可能与您现在拥有的 IP 不同)。在 Cloud SQL 实例的连接详细信息中,您应该查看是否有私有 IP,如果没有,您可以在实例设置中启用它(需要关闭并重新启动)。否则,您可以确保设置了公共 IP 地址,它可能是 34.xx.x.x IP,然后是允许列表(白名单,但我正在尝试更改术语)AI Platform 的云 IP 地址。

    您可以在此处了解 GCP 处理 IP 范围的方式:https://cloud.google.com/compute/docs/ip-addresses/

    将这些范围添加到 Cloud SQL 连接设置中的授权网络后,您应该可以直接从 AI Platform 进行连接。


    原始回复

    当您尝试从 AI 平台连接到代理时,代理在哪里运行?还在你的本地机器上吗?所以基本上,在场景 1 中,您使用 docker run 在本地运行容器,并连接到本地 IP:172.17.0.2,然后当您转移到 AI 平台时,您将连接到本地机器 34 .xx.x.x? 因此,首先,您可能想从原始问题中删除您的实际家庭 IP 地址。人们在互联网上很粗鲁,如果那真的是你的家庭 IP,那可能会很糟糕。 其次,你有多确定你已经在防火墙上打开了一个洞来允许来自 AI 平台的流量进入?一般来说,这就是我认为问题所在,您在本地计算机上的连接被拒绝,导致的错误是无法连接。

    【讨论】:

    • 在第一个示例中,代理正在我的办公室中运行,我正在从办公室的本地 docker 容器连接到它(只是为了向自己证明容器设置正确) .在第二种情况下(涉及 AI 平台)我根本没有运行代理。我认为连接的双方都在谷歌云中,因为我告诉他们运行,所以应该不需要在混合中使用代理。这不正确吗?
    • 所以 34.x.x.x 是我的实例的 google cloud sql ip 地址,172.17.0.2 是运行 cloud sql 代理的 docker 容器的本地地址
    • 噢噢噢不,那行不通。 :D 如果你直接连接到 CloudSQL 实例,你需要做一些更神奇的事情......比如确保 AI 实例和你的 CloudSQL 实例在同一个 VPC 上并使用私有 IP 连接,或者确保您在 Cloud SQL 实例上使用公共 IP 连接选项已启用,并且您已授权 AI 平台的 IP。我忘了它是什么,但它会使用 IP 块,并且您需要确保将平台的 IP 列入白名单(白名单,但更多 PC),以便它可以直接连接。
    • 更明确地说,GCP 中的网络并不像它应该的那样简单。不同的组件实际上在网络上是隔离的。当您说“AI 平台”时,您指的是哪个产品?我还没有尝试从 CloudSQL 实例中提取训练数据,但那里可能有一篇博客文章。 :) 如果是这样,我将在上面编辑我的答案,以便清楚修复是什么/曾经是什么,以便您接受它。
    • 为了回答你的问题,我正在尝试使用它所指的任何产品:cloud.google.com/ml-engine/docs/training-jobs 我不知道为什么我假设同一个项目中的所有资源都会被沙箱化在一起并隐含地列入白名单(除了我是这个云的新手)。你帮助我消除了这个想法,这对找到一个计划非常有帮助(我想我只是将代理与培训工作捆绑在一起)。如果您编辑您的问题以表明此自动沙盒不会发生,我会将其标记为已接受。谢谢。
    【解决方案2】:

    这是我在不需要 VPC 对等互连或单独代理的情况下完全通过我的 Python 项目完成的。

    1. 我在自定义容器中使用了适用于 Python 驱动程序的 Cloud SQL 连接器。 顺便说一句,我建议使用连接器作为默认方法来连接到应用程序中的 Cloud SQL 实例,因为它抽象了跨环境的连接详细信息。您只需要确保您的环境具有正确的应用程序默认凭据即可连接。不需要代理。

    2. 使用我创建的自定义服务帐户运行作业,该帐户包括 Cloud SQL 客户端 以及带有 iam 的 Platform AI Service Agent 的自定义版本。 serviceAccounts.actAs 权限添加到此处指定的角色。 https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig

    3. 您无法通过 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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      相关资源
      最近更新 更多