Google compute engine Python GCP-API权限问题:compute.instances.list

Google compute engine Python GCP-API权限问题:compute.instances.list,google-compute-engine,Google Compute Engine,我有一个失败的5行Python脚本 GCP表示GCP-API权限问题。 我不确定它是否告诉了我真相 以下是Python语法: import googleapiclient.discovery compute = googleapiclient.discovery.build('compute', 'v1') project_s = 'shining-sol-241621' zone_s = 'us-central1-a' result = compute.instances().li

我有一个失败的5行Python脚本

GCP表示GCP-API权限问题。 我不确定它是否告诉了我真相

以下是Python语法:

import googleapiclient.discovery
compute   = googleapiclient.discovery.build('compute', 'v1')
project_s = 'shining-sol-241621'
zone_s    = 'us-central1-a'

result = compute.instances().list(project=project_s, zone=zone_s).execute()
上述语法取决于此env变量设置:

export GOOGLE_APPLICATION_CREDENTIALS=$HOME/secret.json
当我运行Python语法时,我看到:

$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import googleapiclient.discovery
>>> compute   = googleapiclient.discovery.build('compute', 'v1')
>>> project_s = 'shining-sol-241621'
>>> zone_s    = 'us-central1-a'
>>> result = compute.instances().list(project=project_s, zone=zone_s).execute()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/googleapiclient/http.py", line 851, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/compute/v1/projects/shining-sol-241621/zones/us-central1-a/instances?alt=json returned "Required 'compute.instances.list' permission for 'projects/shining-sol-241621'">
>>> >>>
$python3
Python 3.5.2(默认值,2018年11月12日,13:43:14)
[GCC 5.4.0 20160609]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入GoogleAppClient.discovery
>>>compute=googleapiclient.discovery.build('compute','v1')
>>>项目_s='shining-sol-241621'
>>>分区_s='us-central1-a'
>>>结果=compute.instances().list(项目=项目,区域=区域)。执行()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
位置包装中的文件“/usr/local/lib/python3.5/dist packages/googleapiclient/_helpers.py”,第130行
已包装退货(*args,**kwargs)
文件“/usr/local/lib/python3.5/dist-packages/googleapiclient/http.py”,执行中的第851行
raise HttpError(resp,content,uri=self.uri)
GoogleAppClient.errors.HttpError:
>>> >>>
在上面,我在错误中看到此消息:

“需要'compute.instances.list'对'projects/shining-sol-241621'的权限”

在此URL:

当我查看secret.json文件附带的服务帐户权限时,我发现我已将这些权限附加到该帐户:

  • 计算机管理员
  • 计算实例管理(测试版)
  • 计算实例管理(v1)
  • 计算机查看器
  • 安全管理员
  • 所有者
当我将权限附加到服务帐户时,我发现没有可用的权限,如下所示: 'compute.instances.list'

我注意到Compute Admin权限有以下描述:

“完全控制所有计算引擎资源”

该描述向我建议,权限应该能够执行:“compute.instances.list”

我怀疑GCP告诉我我有权限问题,但问题出在其他地方


根据我的描述,为了克服这种糟糕的API行为,有什么好问题可以问吗?

在我假设GCP服务器正在缓存糟糕的信息之后,我能够解决这个问题

我创建了一个服务帐户,其名称在过去从未使用过

我只给了它一个许可:项目所有者

我要求它创建一个JSON密钥

我将密钥复制到$HOME/secret.json中

我发出了shell命令:

export GOOGLE_APPLICATION_CREDENTIALS=$HOME/secret.json
我尝试了6行Python代码:

$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import googleapiclient.discovery
>>> compute   = googleapiclient.discovery.build('compute', 'v1')
>>> project_s = 'shining-sol-241621'
>>> zone_s    = 'us-central1-a'
>>> result = compute.instances().list(project=project_s, zone=zone_s).execute()
>>> result['items'][0]['status']
'RUNNING'
>>> 
>>> 
正如你所看到的,它成功了。

在我假设GCP服务器正在缓存错误信息后,我能够修复此问题

我创建了一个服务帐户,其名称在过去从未使用过

我只给了它一个许可:项目所有者

我要求它创建一个JSON密钥

我将密钥复制到$HOME/secret.json中

我发出了shell命令:

export GOOGLE_APPLICATION_CREDENTIALS=$HOME/secret.json
我尝试了6行Python代码:

$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import googleapiclient.discovery
>>> compute   = googleapiclient.discovery.build('compute', 'v1')
>>> project_s = 'shining-sol-241621'
>>> zone_s    = 'us-central1-a'
>>> result = compute.instances().list(project=project_s, zone=zone_s).execute()
>>> result['items'][0]['status']
'RUNNING'
>>> 
>>> 
正如你所看到的,它成功了。 耶