提问者:小点点

顶点AI管道的秘密经理


我正在GCP使用kubeflow创建一个顶点AI管道,是时候更安全地存储我的API密钥了。我对GCP很陌生,不熟悉环境,所以我一直在尝试遵循一些教程,但遇到了障碍。我想将我的秘密存储在秘密管理器中,然后从我编写的管道中访问它们。我没有问题创建秘密并在GUI中查看它们,但当涉及到编译我的管道时,我得到了错误:谷歌。api_core.例外。PermissionDened: 403资源项目上的权限被拒绝…

因此,运行我的管道的帐户似乎无法访问我创建的机密。那么,我的问题是,如何检查哪个帐户正在运行管道,以便我可以授予它访问权限?还是这里真的存在另一个潜在问题?

试图访问秘密的代码:

 client = secretmanager.SecretManagerServiceClient()
 secret_name = "secret_name"
 request = {'name': f"path/{secret_name}/versions/latest"}
 response = client.access_secret_version(request)
 secret_string = response.payload.data.decode("UTF-8")

编辑:我可以补充说,我一直在玩很多帐户权限,但我最好的猜测是,在顶点下找到的帐户AI


共3个答案

匿名用户

在我的情况下,问题是我没有使用自定义服务号,根据这个页面:

注意:如果您希望您的自定义训练代码获得具有https://www.googleapis.com/auth/cloud-platform范围的OAuth 2.0访问令牌,那么您必须使用自定义服务号进行训练。您不能将此级别的访问权限授予顶点AI自定义代码服务代理。

由于秘密管理器客户端需要上述访问令牌,您需要先创建自己的自定义服务号。创建一个后(附加适当的权限,即秘密管理器秘密访问器),您可以将服务号附加到需要它的作业上。

 @component(
     packages_to_install=['google-cloud-secret-manager']
 )
 def print_secret_op(project_id: str, secret_id: str, version_id: str) -> str:
     from google.cloud import secretmanager

     secret_client = secretmanager.SecretManagerServiceClient()
     secret_name = f'projects/{project_id}/secrets/{secret_id}/versions/{version_id}'
     response = secret_client.access_secret_version(request={"name": secret_name})
     payload = response.payload.data.decode("UTF-8")
     answer = "The secret is: {}".format(payload)
     print(answer)
     return answer


print_secret_job = create_custom_training_job_from_component(
    print_secret_op,
    service_account="your-service-account-email",
)

匿名用户

运行命令gcloud auth list可能会帮助您确定您正在使用的帐户。此外,您可以对您在项目中创建的帐户进行故障排除,并通过遵循此留档查看帐户的角色。

要使用管道访问机密管理器,您需要授予运行管道的服务号以机密管理器权限。您可以在为顶点AI管道配置您的Google Cloud项目部分查看如何配置具有细粒度权限的服务号。

在运行管道的服务号上设置秘密管理器权限后,您可以访问秘密。

此外,您可以查看此留档以了解如何使用kubeflow管道访问机密。

匿名用户

Vertex Pipeline组件中出现的错误google.api_core. Exctions.PermissionDened:403 PermissionDened通常是因为您没有将项目指定给GCP的客户端库实例。

client = secretmanager.SecretManagerServiceClient()  # <---- NO project specified

它在您的代码中的访问Google Cloud服务中进行了解释。

出现此问题的原因是VertexAI不会直接在您的Google Cloud项目中运行您的代码。相反,VertexAI在Google管理的几个独立项目之一中运行您的代码。VertexAI专门将这些项目用于与您的项目相关的操作。因此,不要试图从您的训练或预测代码中的环境中推断项目ID;显式指定项目ID。

因为你没有指定项目IDSecurManagerServiceClient,它试图连接到谷歌管理的顶点AI项目的秘密管理器服务,这当然不允许你访问它。

根据代码中访问Google Cloud服务中的示例,在实例化GCP服务客户端时,IDproject参数指定您的项目。

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

相关问题