有人能帮我从应用程序引擎应用程序访问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()
[或类似]
祝你好运!