从应用程序引擎应用程序访问大查询表的凭据无效



有人能帮我从应用程序引擎应用程序访问Big Query吗?

我已经完成了以下步骤-

创建了一个应用程序引擎项目。

在/lib中安装了googleapi客户端、oauth2client依赖项等。

通过云控制台为应用引擎项目启用了大查询API。

创建了一些"应用程序默认凭据"("服务帐户密钥")[JSON],并将其保存到应用程序引擎应用程序的根目录中。

根据以下内容创建了"大查询服务资源"-

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是应用程序引擎应用程序的短名称)-

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">

关于我可能做错或遗漏的步骤,有什么想法吗?整个身份验证过程似乎是一场噩梦,与应用程序引擎/PaaS的易用性理念大相径庭:-(

谢谢。

好吧,尽管我是谷歌云的粉丝,但这绝对是我一段时间以来不得不做的最糟糕的事情。糟糕/不一致/不存在的文档、复杂性、错误等。尽可能避免!

1) 确保您的应用程序引擎"默认服务帐户"存在

https://console.cloud.google.com/apis/dashboard?project=XXX&持续时间=PTH1

只有当默认服务帐户不存在时,才可以选择创建该帐户。如果你无意中删除了它,你将需要一个新的项目;你无法重新创建它。

如何恢复谷歌应用程序引擎';s";默认服务帐户";

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

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

2) 安装谷歌api python客户端并应用修复

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

假设这安装了oath2client3.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

这里的问题是AppEngine的dev_appserver.py不包括任何大查询复制(natch);因此,当你与大查询表交互时,它是你正在玩的生产数据;您需要登录才能访问。

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

4) 在应用引擎控制台中启用大查询API;创建大查询ProjectID

https://console.cloud.google.com/apis/dashboard?project=XXX&持续时间=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()

[或类似]

祝你好运!

最新更新