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

时间:2015-12-11 11:38:16

标签: python google-compute-engine google-cloud-datastore protocol-buffers

我正在尝试在此网址上找到的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    

简而言之,这似乎很简单。这里有人有同样的问题,并找到了解决方法吗?

1 个答案:

答案 0 :(得分:4)

这里的问题是:

  

在创建我的实例时,我检查了选项:

     

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

有人会认为这会使你的实例获得所有范围,但似乎它不起作用。我已尝试过,如果您使用以下方法检查新创建的实例:

gcloud compute instances describe my-instance

你会发现它只有一个范围

scopes:
  - https://www.googleapis.com/auth/cloud-platform

这里的解决方案是

  • 手动启用&#34;用户信息&#34;和#34;云数据存储&#34; (&#34;管理,磁盘,网络,访问和安全选项&#34;&gt;&#34;访问和安全&#34;)通过开发者控制台创建实例时
  • 确保在使用gcloud命令时使用正确的范围标记(--scopes datastore,userinfo-email),如Getting started with Google Cloud Datastore and Python/Protobuf文章
  • 中所述