有人可以帮我从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易用性理念相悖: - (
谢谢。
答案 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并从控制台登录
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()
[或类似]
祝你好运!