首页 > 解决方案 > 服务帐号无法访问 AppEng 发起的 BQ 查询结果

问题描述

当在 AppEngine 上运行的应用程序(使用 App Engine 默认服务帐户凭据, )SERVICE-ACCOUNT@PROJECT-ID.iam.gserviceaccount.com上启动查询时,我的云功能 CF(使用服务帐户凭据, )无法获取 BQ 查询结果PROJECT-ID@appspot.gserviceaccount.com

文件“/env/local/lib/python3.7/site-packages/google/cloud/_http.py”,第 293 行,在 api_request 中引发 exceptions.from_http_response(response) google.api_core.exceptions.Forbidden: 403 GET https: //www.googleapis.com/bigquery/v2/projects/[PROJECT]/queries/[BQ-JOB-ID]?maxResults=0:拒绝访问:数据集 [TEMP-DATASET-ID-STORING-QUERY-RESULTS]:用户 [SERVICE-ACCOUNT-EMAIL] 无权访问其他用户的作业结果。```

整个事情有 2 个部分(一切都使用 PY3.x 客户端库)

A 部分:在 AppEng 灵活环境上运行。(Py3.x) 发起一个 BQ 查询job.insert。请求通过将此 job_id 发布到 Pubsub 主题而结束。

B 部分:云函数(python37 运行时,触发此 Pubsub 事件):

在 STEP4 上,我遇到了上述错误(获得了 rrom Stackdriver Logging)

我承认,即使

是不同的,但两个 Google 帐户电子邮件都具有项目编辑级别的权限,因此希望 CF 能够访问查询作业结果!更重要的是,当 CF(使用服务帐户凭据)能够通过 STEP2(job.get,轮询作业状态直到完成)时,只有检索查询结果(STEP4)会引发错误

任何指导都将不胜感激!

标签: python-3.xgoogle-app-enginegoogle-cloud-platformgoogle-bigquerygoogle-cloud-functions

解决方案


如果您正在运行作业并使用不同身份的结果,请将结果保存到命名的目标表中。您可以设置具有较短 TTL 的指定数据集,以便在此之后自动删除表。默认情况下,缓存/匿名结果仅限于查询创建者。

可以在 BigQuery 文档中找到使用目标表构建查询的示例。


推荐阅读