我正在尝试在此网址上找到的adams.py示例 https://cloud.google.com/datastore/docs/getstarted/start_python/
正如在此网址中解释的那样:
如果您在Google Compute Engine上运行此代码,则无需创建新的服务帐户凭据,因为在使用数据存储区和userinfo-email范围创建实例时,将使用项目的默认服务帐户。
在创建我的实例时,我检查了选项:
允许API访问同一项目中的所有Google Cloud服务。
当我跑步时
python adams.py my-instance
我明白了:
ERROR:root:Error while doing datastore operation
ERROR:root:RPCError: beginTransaction Invalid Credentials
ERROR:root:HTTPError: 401 Unauthorized
实际上,即使我为实例使用了错误的名称,我也会得到相同的消息。
我的问题似乎与一年前的这个帖子相似:Connect google datastore from existing google compute engine in python
在我自己的代码中,它可以正常访问BigQuery,然后当涉及到数据存储时,它会引发相同的错误,但至少是更具体的解决该行,这是最后一行:resp = datastore.commit(req) 。以下是使用数据存储区的代码部分。
req = datastore.CommitRequest()
req.mode = datastore.CommitRequest.NON_TRANSACTIONAL
dsDashboard = req.mutation.insert_auto_id.add()
path_element = dsDashboard.key.path_element.add()
path_element.kind = 'Dashboard'
fmt = '%Y-%m-%d'
dashboardDate = dsDashboard.property.add()
dashboardDate.name = 'Date'
dashboardDate.value.string_value = dtDay.strftime(fmt)
dashboardValue = dsDashboard.property.add()
dashboardValue.name = 'Value'
dashboardValue.value.indexed = False
dashboardValue.value.string_value = encode(jDashboard)
resp = datastore.commit(req)
我的代码错误:
Traceback (most recent call last):
File "code.py", line 262, in <module>
main()
File "code.py", line 256, in main
resp = datastore.commit(req)
File "/usr/local/lib/python2.7/dist-packages/googledatastore/__init__.py", line 90, in commit
return get_default_connection().commit(request)
File "/usr/local/lib/python2.7/dist-packages/googledatastore/connection.py", line 135, in commit
datastore_v1_pb2.CommitResponse)
File "/usr/local/lib/python2.7/dist-packages/googledatastore/connection.py", line 195, in _call_method
raise RPCError(method, response, content)
googledatastore.connection.RPCError: commit RPC client failure with HTTP(401) Unauthorized: Invalid Credentials
简而言之,这似乎很简单。这里有人有同样的问题,并找到了解决方法吗?
答案 0 :(得分:4)
这里的问题是:
在创建我的实例时,我检查了选项:
允许API访问同一项目中的所有Google Cloud服务。
有人会认为这会使你的实例获得所有范围,但似乎它不起作用。我已尝试过,如果您使用以下方法检查新创建的实例:
gcloud compute instances describe my-instance
你会发现它只有一个范围
scopes:
- https://www.googleapis.com/auth/cloud-platform
这里的解决方案是