python-3.x - 服务帐号无法访问 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 事件):
- STEP1 : 接收这个查询 job_id in
PubsubMessage
- STEP2 : 检查查询状态直到 DONE,
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)会引发错误
任何指导都将不胜感激!
解决方案
如果您正在运行作业并使用不同身份的结果,请将结果保存到命名的目标表中。您可以设置具有较短 TTL 的指定数据集,以便在此之后自动删除表。默认情况下,缓存/匿名结果仅限于查询创建者。
可以在 BigQuery 文档中找到使用目标表构建查询的示例。
推荐阅读
- django - Vscode 没有读取我的默认值并告诉我没有输入任何值
- mysql - 如何每个字段只拾取一行?
- php - API 提供 406 代码并接受应用程序/json 请求:Bluehost
- azure-application-insights - AppInsights 查询以显示每个请求的 RPS
- android - Hilt - 如何将依赖项注入适配器?
- python - 在 Python 中为 OBS 下载临时文件
- performance - html 头与 http 头中的预连接 - 兼容性
- docker - Docker / Windows Server 2016 - 尝试提取图像时拒绝访问
- java - SSHJ中不同超时的含义
- reactjs - 使用不是选项之一的内容预填充 React Material UI 自动完成