如何使用多个服务账号与gcloud?

43

我有两个谷歌云服务帐户,每个项目都有一个。

# 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?

2个回答

58

您有几种选项:

  • 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提供了一个命名配置抽象层。有关完整详细信息,请参见文档,但您可以运行:

  • $ 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
    

    4
    除了以上回答,gcloud还支持--account和--configuration标志。可以通过gcloud auth list列出--account的可能值,也可以通过gcloud config configurations list列出--configuration的可能值。但这两个标志不能与gsutil或bq一起使用。 - cherba
    我在创建新实例时,是否有理由不勾选“允许对所有云 API 进行完全访问”?我在 GCloud 文档中找到了这一行:“通常,Google 建议需要调用 Google API 的每个实例都应作为服务帐号运行,并具有执行其工作所需的最低权限。” 但是在阅读此处的内容时,我不明白为什么要这样建议。 - Nathan majicvr.com
    另一方面,我曾经有这样的经历:我创建了一个实例,然后在一个月或两个月后,我忘记了创建它时所需的详细信息,我想要访问一些方便的Google API,然后我不得不“搜索引擎周围”以找到为我的服务帐户授予权限的方法。因此,我可能会授予比我需要的更多的权限。我主要担心的是1.某人以某种方式访问我的VM并滥用这些权限,但也许2.由于我拥有比我需要的更多的权限,我可能会意外地破坏某些东西。 - Nathan majicvr.com

    41

    Zachary的回答很有用,但使用gcloud配置有更简单的方法。

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

    使用gcloud config configurations create [配置名称]创建新配置:

    > 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]使用新设置重新初始化此配置[testconfig]
    • 然后它将要求您选择或登录帐户。
    • 随后它会要求您选择或创建项目。
    • 最后,它会询问您是否想为项目设置默认区域。这取决于您,在所有内容都在同一区域的项目上,可以设置它。

     

    Your Google Cloud SDK is configured and ready to use!
    

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


    1
    太棒了,正是我所需要的答案。谢谢! - Nirvan Nagar
    1
    这非常简单明了。这可能是新答案。 - Leo Lei

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接