Python 无效凭据-尝试从GCE实例访问Google数据存储时为401
我正在尝试在这个URL上找到的adams.py示例 如本URL中所述: 如果您在Google Compute Engine上运行此代码,则不必创建新的服务帐户凭据,因为在创建具有datastore和userinfo电子邮件作用域的实例时,将使用项目的默认服务帐户 创建实例时,我选中了以下选项: 允许API访问同一项目中的所有Google云服务 当我跑的时候 python adams.py我的实例 我得到:Python 无效凭据-尝试从GCE实例访问Google数据存储时为401,python,google-compute-engine,google-cloud-datastore,protocol-buffers,Python,Google Compute Engine,Google Cloud Datastore,Protocol Buffers,我正在尝试在这个URL上找到的adams.py示例 如本URL中所述: 如果您在Google Compute Engine上运行此代码,则不必创建新的服务帐户凭据,因为在创建具有datastore和userinfo电子邮件作用域的实例时,将使用项目的默认服务帐户 创建实例时,我选中了以下选项: 允许API访问同一项目中的所有Google云服务 当我跑的时候 python adams.py我的实例 我得到: ERROR:root:Error while doing datastore o
ERROR:root:Error while doing datastore operation
ERROR:root:RPCError: beginTransaction Invalid Credentials
ERROR:root:HTTPError: 401 Unauthorized
事实上,即使我为实例使用了错误的名称,我也会收到相同的消息
我的问题似乎与一年前的这个帖子相似:
在我自己的代码中,它可以很好地访问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
回溯(最近一次呼叫最后一次):
文件“code.py”,第262行,在
main()
文件“code.py”,第256行,主
resp=datastore.commit(请求)
文件“/usr/local/lib/python2.7/dist packages/googledatastore/_init__.py”,第90行,提交
返回get\u default\u connection().commit(请求)
提交文件“/usr/local/lib/python2.7/dist packages/googledatastore/connection.py”,第135行
数据存储(v1\u pb2.CommitResponse)
文件“/usr/local/lib/python2.7/dist packages/googledatastore/connection.py”,第195行,在调用方法中
提高RPCError(方法、响应、内容)
googledatastore.connection.RPCError:使用HTTP(401)提交RPC客户端失败未经授权:凭据无效
简言之,这似乎很简单。这里有没有人遇到过同样的问题并找到了解决办法?这里的问题是:
创建实例时,我选中了以下选项:
允许API访问同一项目中的所有Google云服务
有人会假设这将使您的实例获得所有作用域,但它似乎不是这样工作的。我已经尝试过了,如果您使用以下方法检查新创建的实例:
gcloud compute instances describe my-instance
您将看到它只有一个作用域
scopes:
- https://www.googleapis.com/auth/cloud-platform
这里的解决方案是
- 通过开发者控制台创建实例时,手动启用“用户信息”和“云数据存储”(“管理、磁盘、网络、访问和安全选项”>“访问和安全”)
- 请确保在使用gcloud命令时使用了正确的scopes标志(-scopes datastore,userinfo email),如本文所述