由于没有配额项目的用户凭据而发出警告



我目前正在管理一个GCP项目,并授予具有Viewer的同事访问权限,以便他可以使用其中的资源(主要是从存储中下载文件)。

我遇到了一个问题,这里也有解释。

基本上,在运行gcloud auth application-default login之后,它们可以访问资源,但会收到一个警告

WARNING:                                                                                                                                                                                                                          
Cannot add the project "lixodata" to ADC as the quota project because the account in ADC does not have the "serviceusage.services.use" permission on this project. You might receive a "quota_exceeded" or "API not enabled" error
. Run $ gcloud auth application-default set-quota-project to add a quota project.

对于他们运行的每个需要与GCP交互的脚本,都会重复此警告,这往往会使他的终端变得混乱。

链接的问题解释了如何使警告消失,但需要授予用户serviceusage.services.use权限,该权限不与默认的Viewer角色捆绑在一起。

阅读文档并没有真正向我澄清一些事情:为什么我要使用与我连接的项目不同的计费项目?

我的问题分为两部分:

  • 授予同事serviceusage.services.use的用途/风险是什么?为什么默认情况下不与Viewer角色链接?
  • 是否有其他解决方案来禁用此警告(仅此警告)?

TL;DR因为否则gcloud auth application-default颁发的凭据会在google拥有的项目中消耗配额,而该项目可能(不)启用了该服务。


对于需要身份验证和授权的Google api,使用OAuth。在Google的实现中,Google服务(特定的api)必须在使用前启用,api在Google项目中启用(和聚合)。

有两种重要的"身份"类型,(人类)用户(例如gmail)和软件(有时称为机器人)用户。非辅助(!)软件用户由服务帐户标识。

gcloud是软件,但它主要代表(人类)用户操作。因为gcloud通常需要能够识别它的人类用户(例如你的gmail.com帐户),它以委托的方式运作。gcloud确实有自己的身份,但它(主要)是作为人类用户操作的。

注意你也可以使用gcloud服务帐户。

重要的是,gcloud是一个所谓的安装应用程序。当用户发出gcloud命令时,gcloud提供用户的(!)身份它自己的身份(称为OAuth客户端ID)到谷歌拥有的谷歌项目(!)|运行。

注意这就解释了为什么你可以用gcloud创建项目并启用服务,因为另一个项目(启用了正确的服务)正在代表你影响这些API调用。

当你针对谷歌的服务开发应用程序时,你必须决定代码如何向谷歌进行身份验证。如果它代表用户,那么您还需要创建一个Client ID,并通过该ID路由用户的请求。如果它作为一个独立的解决方案运行(没有用户干预),那么它将作为一个服务帐户运行。

Google的sdk包含一个优雅的功能,叫做应用程序默认凭证(Application Default Credentials, adc)。adc自动发现服务帐户凭证,减少(从而简化)代码,提供可移植性

保持安全。如果你可以使用adc,那么你应该使用。

这会产生(!)一个挑战。对于编写非用户代码的开发人员,如果不创建服务帐户(并下载密钥),他们如何测试软件?解决方案是(!)gcloud auth application-default.

当你使用gcloud auth application-default时,用户(例如gmail.com)凭据被用来创建行为就像adc的凭据。开发人员可以测试他们的代码而不需要必须创建服务帐户和密钥。

然而(!)Google被动地(!)不鼓励使用gcloud auth application-default

在某种程度上,这是因为:
  1. 支持使用gcloud auth application-default请求的Google项目是Google拥有的项目而不是你的项目;谷歌被"计费"了。不是你。
  2. 产生的凭据具有经过认证的用户凭据所具有的所有权力,而不是(希望)更具体(通常是iam控制的)服务帐户的权限
  3. google拥有的Projectmay
  4. 没有启用您要使用的服务。
  5. 这个过程是不透明的,独立的代码可以神奇地通过使用gcloud auth application-defaut的adc对Google Cloud进行身份验证,这可能令人惊讶(也不应该如此)。

你应该基于上述原因,请使用gcloud auth application-default凭据。

如果您正在使用gcloud auth application-default凭证,您应该考虑为什么并选择更好的替代方案:

  • 直接使用用户凭证
  • 或使用服务帐户

如果Google Cloud,最好通过Workload Identity Federation使用Service Account

最新更新