0

當嘗試使用谷歌雲Python3 API客戶端我得到的錯誤創建爲Stackdriver谷歌的Python API訪問被拒絕

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, [email protected]_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()時,我可以看到日誌到達日誌記錄控制檯,因此我可以訪問Stackdriver日誌記錄。

這個設置有什麼錯誤嗎?

在此先感謝。

回答

1

創建接收器需要與寫入日誌條目不同的權限。默認情況下,服務帳戶被賦予項目編輯器(不是所有者),該編輯器沒有創建接收器的權限。

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

確保您使用的服務帳戶具有logging.sinks.create權限。最簡單的方法是將服務帳戶從編輯器切換到所有者,但添加日誌編輯器角色會更好,因此您只需授予它所需的權限即可。