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

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

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

Cloud Run 服務位於 Project Main 中,我正在嘗試存取 Project Other 中的表格 - 這兩個專案都位於同一組織中。

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

在 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()

它在部署到專案主專案中的 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 使用者角色是否足夠?

答案1

查詢表需要權限bigquery.tables.getData。 BigQuery 使用者俱有的角色bigquery.tables.list。將角色更改為BigQuery 資料檢視器(角色/bigquery.dataViewer)。

BigQuery 預定義角色和權限

修改/寫入表格需要權限bigquery.tables.updateData。該權限位於以下角色:

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

相關內容