从App Engine应用程序访问Big Query表的凭据无效

时间:2016-08-03 11:04:46

标签: google-app-engine

有人可以帮我从App Engine应用程序访问Big Query吗?

我已完成以下步骤 -

创建了一个App Engine项目。

将google-api-client,oauth2client依赖关系(等)安装到/ lib。

通过云控制台为App Engine项目启用Big Query API。

创建了一些'应用程序默认凭据' (a'服务帐户密钥')[JSON]并将其保存到App Engine应用程序的根目录。

创建了一个大查询服务资源'按照以下内容 -

def get_bigquery_service():
    from googleapiclient.discovery import build
    from oauth2client.client import GoogleCredentials
    credentials=GoogleCredentials.get_application_default()
    bigquery_service=build('bigquery', 'v2', credentials=credentials)
    return bigquery_service

验证资源是否存在 -

<googleapiclient.discovery.Resource object at 0x7fe758496090>

尝试使用以下内容查询资源(ProjectId是App Engine应用程序的简称) -

bigquery=get_bigquery_service()
bigquery.tables().list(projectId=#{ProjectId},
                   datasetId=#{DatasetId}).execute()

返回以下内容 -

<HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/#{ProjectId}/datasets/#{DatasetId}/tables?alt=json returned "Invalid Credentials">

关于步骤的任何想法我可能错了或在这里丢失?整个身份验证过程似乎是一场噩梦,与App Engine / PaaS易用性理念相悖: - (

谢谢。

1 个答案:

答案 0 :(得分:1)

好吧,尽管一般来说是Google Cloud粉丝,但这绝对是我不幸在一段时间内不得不继续工作的最糟糕的事情。差/不一致/不存在的文档,复杂性,错误等等。如果可以,请避免使用!

1)确保您的App Engine&#39;默认服务帐户&#39;存在

https://console.cloud.google.com/apis/dashboard?project=XXX&duration=PTH1

您可以选择创建默认服务帐户,只有它不存在。如果您意外删除了它,您将需要一个新项目;你不能重新创造它。

How to recover Google App Engine's "default service account"

您可能应该创建一组默认的JSON凭据,但您不需要将它们作为项目的一部分包含在内。

您不需要为Big Query或其他方式创建任何其他服务帐户。

2)安装google-api-python-client并应用修复

pip install -t lib google-api-python-client

假设这安装了oath2client 3.0.x,那么在测试时你会收到以下投诉:

File "~/oauth2client/client.py", line 1392, in _get_well_known_file
default_config_dir = os.path.join(os.path.expanduser('~'),
File "/usr/lib/python2.7/posixpath.py", line 268, in expanduser
import pwd
File "~/google_appengine-1.9.40/google/appengine/tools/devappserver2/python/sandbox.py", line 963, in load_module
raise ImportError('No module named %s' % fullname)
ImportError: No module named pwd

你可以通过改变〜/ oauth2client / client.py [第1392行]来修复:

os.path.expanduser('~')

为:

os.env("HOME")

并将以下内容添加到app.yaml:

env_variables:
  HOME: '/tmp'

丑陋但有效。

3)下载GCloud SDK并从控制台登录

https://cloud.google.com/sdk/

gcloud auth login

这里的问题是App Engine的dev_appserver.py不包含任何大查询复制(natch);因此,当您与Big Query表进行交互时,它就是您正在玩的生产数据;你需要登录才能获得访问权限。

回想起来很明显,但记录不清。

4)在App Engine控制台中启用Big Query API;创建一个Big Query ProjectID

https://console.cloud.google.com/apis/dashboard?project=XXX&duration=PTH1

https://bigquery.cloud.google.com/welcome/XXX

5)测试

from oauth2client.client import GoogleCredentials
credentials=GoogleCredentials.get_application_default()
from googleapiclient.discovery import build
bigquery=build('bigquery', 'v2', credentials=credentials)
print bigquery.datasets().list(projectId=#{ProjectId}).execute()

[或类似]

祝你好运!