【问题标题】:Stackdriver Google Python API Access DeniedStackdriver Google Python API 访问被拒绝
【发布时间】:2017-04-22 20:45:21
【问题描述】:

尝试使用 Google Cloud Python3 API 客户端创建 sink 时出现错误:

RetryError: GaxError(Exception occurred in retry method that was not classified as transient, caused by <_Rendezvous of RPC that terminated with (StatusCode.PERMISSION_DENIED, The caller does not have permission)>)

我使用的代码是这个:

import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path_to_json_secrets.json'

from google.cloud.bigquery.client import Client as bqClient
bqclient = bqClient()
ds = bqclient.dataset('dataset_name')

print(ds.access_grants)
[]

ds.delete()
ds.create()

print(ds.access_grants)
[<AccessGrant: role=WRITER, specialGroup=projectWriters>,
 <AccessGrant: role=OWNER, specialGroup=projectOwners>,
 <AccessGrant: role=OWNER, userByEmail=id_1@id_2.iam.gserviceaccount.com>,
 <AccessGrant: role=READER, specialGroup=projectReaders>]

from google.cloud.logging.client import Client as lClient
lclient = lClient()
dest = 'bigquery.googleapis.com%s' %(ds.path)
sink = lclient.sink('sink_test', filter_='jsonPayload.project=project_name', destination=dest)
sink.create()

不太明白为什么会这样。当我使用 lclient.log_struct() 时,我可以看到日志到达 Logging 控制台,因此我可以访问 Stackdriver Logging。

这个设置有什么错误吗?

提前致谢。

【问题讨论】:

    标签: python google-cloud-platform stackdriver google-python-api


    【解决方案1】:

    创建接收器需要不同于写入日志条目的权限。默认情况下,服务帐户被授予项目编辑者(不是所有者),它没有创建接收器的权限。

    查看所需权限列表in the access control docs

    确保您使用的服务帐户具有logging.sinks.create 权限。执行此操作的最简单方法是将服务帐户从 Editor 切换为 Owner,但最好添加 Logs Editor Role,这样您只需授予它所需的权限即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2014-09-19
      • 1970-01-01
      • 2017-11-28
      • 2016-08-22
      • 2017-11-30
      • 2017-12-17
      相关资源
      最近更新 更多