我正在GCP中工作,用kubeflow创建一个顶点AI管道,现在是我更安全地存储API密钥的时候了。我对GCP非常陌生,对环境也不熟悉,所以我一直在努力学习一些教程,但遇到了一些障碍。我想将我的秘密存储在秘密管理器中,然后从我编写的管道中访问它们。我没有问题创建秘密并在GUI中查看它们,但是当涉及到编译我的管道时,我得到了错误:google.api_core.exceptions.PermissionDenied: 403 Permission denied on resource project...
因此,运行我的管道的帐户似乎无法访问我创建的秘密。那么,我的问题是,如何检查哪个帐户正在运行管道,以便授予它访问权限?还是这里真的有另一个潜在的问题?
试图访问秘密的代码:
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>Workbench>the笔记本下找到的帐户,我正在使用的笔记本details>Service帐户是一个需要许可。这不是吗?
发布于 2022-09-13 07:22:56
在我的例子中,问题在于我没有像此页那样使用自定义服务帐户。
注意:如果您希望您的自定义培训代码获得带有OAuth范围的https://www.googleapis.com/auth/cloud-platform 2.0访问令牌,则必须使用自定义服务帐户进行培训。不能授予此级别对顶点AI自定义代码服务代理的访问权限。
由于秘密管理器客户端需要上述访问令牌,因此需要首先创建自己的自定义服务帐户。创建一个服务帐户(附带适当的权限,即Secret Manager Secret Accessor)之后,您可以将服务帐户附加到需要它的作业。
@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",
)发布于 2022-03-16 18:34:44
运行命令gcloud auth list可能会帮助您确定所使用的帐户。此外,您还可以对在项目中创建的帐户进行故障排除,并通过遵循此文档查看帐户所具有的角色。
若要使用管道使用秘密管理器访问机密,需要授予具有秘密管理器权限的运行管道的服务帐户。您可以看到如何使用为顶点AI管道配置Google项目的粒度权限部分配置服务帐户。
在对正在运行管道的服务帐户设置秘密管理器权限后,您可以访问秘密。
此外,您还可以检查这个文档,看看如何使用kubeflow管道访问机密。
发布于 2022-06-04 02:36:39
可能原因
顶点管道组件中的错误google.api_core.exceptions.PermissionDenied: 403 Permission denied通常是因为您没有将项目指定给GCP客户端库实例。
client = secretmanager.SecretManagerServiceClient() # <---- NO project specified这是在在代码中访问Google服务中解释的。
出现此问题是因为顶点AI不直接在Google项目中运行您的代码。相反,顶点AI在Google管理的几个单独项目中运行您的代码。顶点AI将这些项目专门用于与您的项目相关的操作。因此,不要试图在培训或预测代码中从环境中推断项目ID;显式地指定项目ID。
因为您没有将项目ID指定到SecretManagerServiceClient,所以它试图连接到谷歌管理的顶点AI项目的秘密管理器服务,这当然不允许您访问它。
修复
如在代码中访问Google服务中的示例所示,在实例化GCP服务客户端时,将项目ID指定为project参数。
import os
from google.cloud import bigquery
project_number = os.environ["CLOUD_ML_PROJECT_ID"]
client = bigquery.Client(project=project_number)https://stackoverflow.com/questions/71498754
复制相似问题