【问题标题】:Service Account unable to access BQ Query results initiated by AppEng服务帐号无法访问 AppEng 发起的 BQ 查询结果
【发布时间】:2019-01-31 22:12:37
【问题描述】:

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

文件“/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 Flexible env 上运行。 (Py3.x) 发起 BQ 查询job.insert。请求通过将此 job_id 发布到 Pubsub 主题而结束。

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

  • STEP1:在PubsubMessage接收这个查询job_id
  • STEP2:检查查询状态直到完成,job.done
  • STEP3:DONE 检索查询结果时
  • STEP4:获取查询结果后,做最后的处理(至少这是本意)

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

我承认,即使

  • 工作所有者PROJECT-ID@appspot.gserviceaccount.com
  • 和,查询结果消费者SERVICE-ACCOUNT@PROJECT-ID.iam.gserviceaccount.com

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

任何指导都将受到高度评价!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!反馈:最好在网站上的某个地方记录只有查询作业所有者才能访问查询结果表..(或者已经是?我找不到...)。我花了几个小时研究服务帐户的 IAM 权限,并想知道为什么即使授予编辑者访问权限也会不断返回 Permission Denied 错误:)
    • 感谢您的反馈。有一个关于cached results 的文档,但独占权限方面可能更清楚。我会尽快澄清这一点。
    • @shollyman 我也遇到了。当您说“默认情况下缓存/匿名结果仅限于查询创建者”时,考虑到“他可以完全访问所有资源”,是否可以对其进行更改,以便项目所有者可以访问数据集?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2016-08-09
    • 2022-06-29
    • 2022-01-10
    • 2019-03-21
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多