서비스 계정을 사용하여 동일한 조직의 다른 프로젝트에서 BigQuery 데이터에 액세스

서비스 계정을 사용하여 동일한 조직의 다른 프로젝트에서 BigQuery 데이터에 액세스

공식 BigQuery 클라이언트(Python 3)를 Cloud Run 서비스에서 승인된 동일한 조직의 다른 프로젝트로 가져오는 데 심각한 문제가 있습니다.

Cloud Run 서비스는 Project Main에 있고 Project Other의 테이블에 액세스하려고 합니다. 두 프로젝트 모두 동일한 조직에 있습니다.

서비스 계정은 프로젝트 메인에서 생성된 사용자 생성 서비스 계정(기본 서비스 계정 아님)이며 프로젝트 메인에서 서비스 계정으로 실행하는 데 필요한 모든 권한을 갖고 있으며, 서비스 계정의 이메일에는 '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()

이는 프로젝트 기본의 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.getData. BigQuery 사용자의 역할bigquery.tables.list. 역할을 다음으로 변경합니다.BigQuery 데이터 뷰어(역할/bigquery.dataViewer).

BigQuery 사전 정의된 역할 및 권한

테이블을 수정/쓰기 위해서는 해당 권한이 필요합니다.bigquery.tables.updateData. 해당 권한은 다음 역할에 있습니다.

  • BigQuery 관리자(roles/bigquery.admin)
  • BigQuery 데이터 소유자(roles/bigquery.dataOwner)
  • BigQuery 데이터 편집자(roles/bigquery.dataEditor) <- 권장 역할.

관련 정보