gpt4 book ai didi

python - 如何从 GoogleCredentials 获取 projectId?

转载 作者:行者123 更新时间:2023-11-28 20:55:45 24 4
gpt4 key购买 nike

我想使用 Python 获取我在 Google Cloud 上的所有 Dataproc 集群的列表。

我将服务帐户凭据存储在一个 JSON key 文件中,其位置由环境变量 GOOGLE_APPLICATION_CREDENTIALS 引用。这是我到目前为止的代码:

import os
import googleapiclient.discovery
from oauth2client.client import GoogleCredentials


def build_dataproc_service(credentials):
return googleapiclient.discovery.build("dataproc", "v1", credentials=credentials)


def list_clusters():
credentials = GoogleCredentials.get_application_default()
dataproc = build_dataproc_service(credentials)
clusters = dataproc.projects().regions().clusters().list(projectId="my-project", region="REGION").execute()
return clusters


if __name__ == "__main__":
list_clusters()

如您所见,我已经对 projectId 进行了硬编码 ("my-project")。鉴于 projectId 存在于 JSON key 文件中,我希望我可以通过查询 credentials 对象的属性来获得它,但不存在这样的属性。 projectId 确实嵌入在 credentials._service_account_email 字符串属性中,但从那里提取它很笨拙而且感觉不对。

我想一定有更好的方法。如何获取服务账号所在项目的projectId?

请注意,最初我打算让此代码在 Google Compute Engine 实例上的 docker 容器中运行,但将来有一天我可能想在 GKE 上运行。不确定这是否会影响答案。

最佳答案

一种正式的思考方式是,虽然 projectId 有时是服务帐户的属性,但 projectId 通常不是长期凭据的属性.例如,想想您在 gcloud CLI 中使用的离线安装的个人凭证(如果有)与您的 Google 帐户/电子邮件地址相关联。该电子邮件身份不驻留在任何云项目中,但可用于派生 GoogleCredential 对象。

从技术上讲,如果您想“正确地”执行此操作,您需要一个主服务帐户,该帐户有权在所有项目中GET 服务帐户描述,这些项目拥有您计划的实际服务帐户使用,然后调用 IAM API 的 projects.serviceAccounts.get在服务帐户电子邮件地址上,而不是在“凭据”对象上。那里的响应可以识别服务帐户所在的项目 ID。这相当于 gcloud 命令:

gcloud iam service-accounts describe my-service-account@projectid.iam.gserviceaccount.com

但是,正如 Dagang 所说,从长远来看,开始烘焙假设服务帐户将仅用于其所在项目的操作往往会适得其反。特别是,虽然 service account 资源本身存在于项目中,但它们通常以跨项目的方式使用。一种常见的操作模式是使用单个 GCP 项目来管理大量服务帐户,然后授予这些帐户对其他 GCP 项目中资源的各种细粒度访问权限。

关于python - 如何从 GoogleCredentials 获取 projectId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com