Permissions

使用服務帳號訪問同一組織中不同項目的 BigQuery 數據

  • September 16, 2021

我在將官方 BigQuery 客戶端(在 Python 3 中)獲取到由 Cloud Run 服務授權的同一組織中的另一個項目時遇到了一些嚴重問題。

Cloud Run 服務位於 Project Main 中,我正在嘗試訪問 Project Other 中的表——這兩個項目都在同一個組織中。

服務帳戶是在 Project Main 中創建的使用者創建的服務帳戶(不是預設帳戶),並且具有在 Project Main 中作為服務帳戶執行所需的所有權限,並且服務帳戶的電子郵件僅被賦予“BigQuery 使用者”角色在其他項目中。

在 Python 中,我有一個這樣的程式碼片段:

from google.cloud import bigquery

query_str = "SELECT * FROM `project_other.prod.table`"

bqclient = bigquery.Client()
df = bqclient.query(query_str).result().to_dataframe()

這在項目 main 中部署到 Cloud Run 的容器內執行,並且部署附加了正確的服務帳號。

觸發腳本時,我最終遇到如下異常:

raise self._exception google.api_core.exceptions.BadRequest: 400 Access Denied: Table
project_other:prod.table: User does not have permission to query table project_other:prod.table. at [4:13]

據我了解,如果附加到 Cloud Run 部署的服務帳戶具有所需的權限,則您不必在容器中執行任何花哨的身份驗證,因為這一切都是由託管服務“為您完成”的。

有人可以幫我弄清楚為什麼會這樣嗎?服務帳戶iam.serviceAccounts.actAs在 Project Main 中具有這些權限,但它是否也需要 Project Other 中的這些權限,或者 BigQuery 使用者角色是否足夠?

要查詢表,您需要權限bigquery.tables.getData。BigQuery User 角色具有bigquery.tables.list。將角色更改為BigQuery 數據查看者(roles/bigquery.dataViewer)。

BigQuery 預定義角色和權限

要修改/寫入表,您需要權限bigquery.tables.updateData。該權限在角色中:

  • BigQuery 管理員 (roles/bigquery.admin)
  • BigQuery 數據所有者 (roles/bigquery.dataOwner)
  • BigQuery 數據編輯器 (roles/bigquery.dataEditor) <- 推薦角色。

引用自:https://serverfault.com/questions/1077557