Python 无效凭据-尝试从GCE实例访问Google数据存储时为401

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

我正在尝试在这个URL上找到的adams.py示例

如本URL中所述:

如果您在Google Compute Engine上运行此代码,则不必创建新的服务帐户凭据,因为在创建具有datastore和userinfo电子邮件作用域的实例时,将使用项目的默认服务帐户

创建实例时,我选中了以下选项:

允许API访问同一项目中的所有Google云服务

当我跑的时候

python adams.py我的实例

我得到:

    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),如本文所述

您是否检查了提供的答案?您好。非常感谢。在你回答之前,我不得不采取变通办法。我对你的解决方案很好奇,但我没有时间去测试。无论如何谢谢你!