サービス アカウントを使用して同じ組織内の異なるプロジェクトから BigQuery データにアクセスする

サービス アカウントを使用して同じ組織内の異なるプロジェクトから BigQuery データにアクセスする

Cloud Run サービスから承認された同じ組織内の別のプロジェクトに公式 BigQuery クライアント (Python 3) を取得する際に深刻な問題が発生しています。

Cloud Run サービスはプロジェクト メインにあり、プロジェクト その他内のテーブルにアクセスしようとしています。これらのプロジェクトは両方とも同じ組織内にあります。

サービス アカウントは、プロジェクト メインで作成されたユーザー作成のサービス アカウント (デフォルトのものではない) であり、プロジェクト メインでサービス アカウントとして実行するために必要なすべての権限を持ち、サービス アカウントのメールにはプロジェクト その他で「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プロジェクト メインにありますが、プロジェクト その他でもそれらの権限が必要ですか、それとも BigQuery ユーザー ロールで十分ですか?

答え1

テーブルをクエリするには、権限が必要ですbigquery.tables.getDataBigQueryユーザーの役割はbigquery.テーブルリスト役割を変更するBigQuery データ ビューアー(roles/bigquery.dataViewer)。

BigQuery 定義済みのロールと権限

テーブルを変更/書き込むには、権限が必要ですbigquery.tables.updateDataその権限は次のロールにあります:

  • BigQuery 管理者 (roles/bigquery.admin)
  • BigQuery データオーナー (roles/bigquery.dataOwner)
  • BigQuery データ編集者 (roles/bigquery.dataEditor) <- 推奨されるロール。

関連情報