如何在 gcloud 中使用多个服务帐户?

Posted

技术标签:

【中文标题】如何在 gcloud 中使用多个服务帐户?【英文标题】:How to use multiple service accounts with gcloud? 【发布时间】:2017-12-02 20:36:55 【问题描述】:

我有两个 Google Cloud 服务帐号;我的两个项目各有一个。

# ACCOUNTS
editor@someproj-1.iam.gserviceaccount.com
editor@someproj-2.iam.gserviceaccount.com

我可以告诉gcloud在执行命令之前我需要使用哪个帐户:

gcloud set account [ACCOUNT]

问题:有什么方法可以配置gcloudgsutil,以便它们用于在各自项目中执行的操作,而无需我在这些帐户之间手动切换所有时间?


我在一个项目中管理实例,并从另一个项目的存储桶中上传/下载文件。在命令之间必须一直执行gcloud set_account [ACCOUNT] 变得相当乏味。

我需要同时在两个项目中运行长时间运行的命令,这使我认为如果我激活/停用用于这些命令的帐户,我会陷入困境。

也许我唯一的选择是从两个不同的 Docker 容器运行 google-cloud-sdk?

【问题讨论】:

【参考方案1】:

你有几个选择:

Cloud SDK 尊重指定属性的环境变量。 gcloud config set accountgcloud config set core/account的简写,所以对应的属性是CLOUDSDK_CORE_ACCOUNT

你可以这样做:

$ CLOUDSDK_CORE_ACCOUNT=email1@domain1.com gcloud ...
$ CLOUDSDK_CORE_ACCOUNT=email2@domain2.com gcloud ...

这应该会得到你感兴趣的结果。

如果您需要更改多个属性,Cloud SDK 提供named configuration 抽象。有关完整详细信息,请参阅文档,但您可以运行:

$ gcloud config configurations create my-project1-config
$ gcloud config configurations activate my-project1-config
$ gcloud auth login  # or activate-service-account
$ gcloud config set project project1  # and any other configuration you need to do
$ 
$ gcloud config configurations create my-project2-config
$ gcloud config configurations activate my-project2-config
$ gcloud auth login  # or activate-service-account
$ gcloud config set project project2  # and any other configuration you need to do
$
$ CLOUDSDK_ACTIVE_CONFIG_NAME=my-project1-config gcloud ...
$ CLOUDSDK_ACTIVE_CONFIG_NAME=my-project2-config gcloud ...

在最极端的情况下,您可以维护单独的 Cloud SDK 配置目录。默认(在 *nix 上)是 ~/.config/gcloud:

$ CLOUDSDK_CONFIG=/tmp/tmpconfig1 gcloud auth login
$ CLOUDSDK_CONFIG=/tmp/tmpconfig2 gcloud auth login

【讨论】:

要添加到这个答案,gcloud 支持 --account 和 --configuration 标志。 --account 的可能值可以通过gcloud auth list 列出,配置的可能值可以通过gcloud config configurations list 列出。但这两个标志不能与 gsutil 或 bq 一起使用。 创建新实例时是否有理由不勾选“允许完全访问所有 Cloud API”?我在 GCloud 文档中找到了这一行:“一般而言,Google 建议需要调用 Google API 的每个实例都应作为服务帐户运行,并具有该实例完成其工作所需的最低权限。” .但是读到here,我不明白为什么这是推荐的 另一方面,我有过创建实例的经验,然后在我忘记创建实例的细节之后的一两个月内,我想访问一些方便的 Google API,然后我必须“搜索引擎”来授予我的服务帐户权限。所以我可能会继续授予比我需要更多的权力。我主要担心 1. 有人以某种方式访问​​我的虚拟机并滥用这些权限,但也许 2. 由于我拥有的权力超出了我的需要,我以后可能会意外破坏某些东西【参考方案2】:

Zachary 的回答非常有用,但有一种更简单的方法可以使用 gcloud 的配置。

运行gcloud config configurations list 以显示您的配置列表。如果您还没有创建任何内容,它只会列出 default 以及您当前处于活动状态的帐户、项目等。

使用gcloud config configurations create [config name] 创建一个新配置:

> gcloud config configurations create testconfig
Created [testconfig].
Activated [testconfig].

新配置现在将处于活动状态,因此请继续使用gcloud init 进行设置:

> gcloud init
Welcome! This command will take you through the configuration of gcloud.

然后它会问你一系列问题:

当它要求您选择要使用的配置时,选择 [1] Re-initialize this configuration [testconfig] with new settings。 然后它会要求您选择或登录帐户。 然后它会要求您选择或创建一个项目。 最后,它会询问您是否要为您的项目设置默认区域。由你决定;对于所有内容都在同一区域的项目,请继续设置。

 

Your Google Cloud SDK is configured and ready to use!

使用gcloud config configurations activate [config name]切换帐户。

【讨论】:

很棒的答案,正是我所需要的。谢谢! 这非常简单。这应该是新的答案。

以上是关于如何在 gcloud 中使用多个服务帐户?的主要内容,如果未能解决你的问题,请参考以下文章

使用 gcloud 服务帐户登录到 Firebase

在没有 gcloud 的情况下获取服务帐户身份验证令牌?

gcloud:用户无权访问服务帐户“默认”

如何使用服务帐户在 gcp 中设置正确的 iam 策略

gcloud\kubectl 身份验证问题:忘记服务帐户

政策报告,用于查看帐户在 GCloud 上可以访问的所有资源的摘要