공식 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.tables.updateData. 해당 권한은 다음 역할에 있습니다.
- BigQuery 관리자(roles/bigquery.admin)
- BigQuery 데이터 소유자(roles/bigquery.dataOwner)
- BigQuery 데이터 편집자(roles/bigquery.dataEditor) <- 권장 역할.