服务帐户无法访问AppEng发起的BQ查询结果

时间:2018-08-25 21:10:41

标签: python-3.x google-app-engine google-cloud-platform google-bigquery google-cloud-functions

当在运行在AppEngine上的应用上启动查询(使用App Engine默认服务帐户凭据{{1})时,我的云功能CF(使用服务帐户凭据sudo apt-get install php-xml)无法获取BQ查询结果。 })

  api_request中的

文件“ /env/local/lib/python3.7/site-packages/google/cloud/_http.py”,第293行引发异常。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]没有访问其他用户作业结果的权限。   ```

整个过程分为两部分(使用PY3.x客户库的所有内容)

PART A :在AppEng Flexible环境中运行。 (Py3.x)启动BQ查询SERVICE-ACCOUNT@PROJECT-ID.iam.gserviceaccount.com。该请求通过将该job_id发布到Pubsub主题而结束。

PART B :一个Cloud函数(python37运行时,在此Pubsub事件上触发):

  • STEP1 :在PROJECT-ID@appspot.gserviceaccount.com
  • 中收到此查询job_id
  • STEP2 :检查查询状态,直到完成job.insert
  • STEP3 :DONE检索查询结果时
  • STEP4 :在获取查询结果后,进行最终处理(至少是这样做的目的)

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

即使

我也承认
  • 工作拥有者PubsubMessage
  • ,然后查询结果使用者job.done

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

任何指导都是高度可取的!

1 个答案:

答案 0 :(得分:3)

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

使用目标表can be found in the BigQuery docs构建查询的示例。