Acessando dados do BigQuery de diferentes projetos na mesma organização com uma conta de serviço

Acessando dados do BigQuery de diferentes projetos na mesma organização com uma conta de serviço

Estou tendo sérios problemas para levar o cliente oficial do BigQuery (em Python 3) para um projeto diferente na mesma organização autorizado por um serviço Cloud Run.

O serviço Cloud Run está no Project Main e estou tentando acessar uma tabela no Project Other – ambos os projetos estão na mesma organização.

A conta de serviço era uma conta de serviço criada pelo usuário no Project Main (não a padrão) e tem todas as permissões necessárias para ser executada como uma conta de serviço no Project Main, e o e-mail da conta de serviço recebeu apenas a função "Usuário do BigQuery" no Projeto Outro.

Em Python, tenho um trecho de código como este:

from google.cloud import bigquery

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

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

Isso é executado dentro do contêiner implantado no Cloud Run no projeto principal, e a implantação tem a conta de serviço correta anexada a ela.

Ao acionar o script, acabo com uma exceção como a seguinte:

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]

Pelo que entendi, se a conta de serviço anexada à implantação do Cloud Run tiver as permissões necessárias, você não precisará fazer nenhuma autenticação sofisticada no contêiner, pois tudo é "feito para você" pelo serviço gerenciado.

Alguém pode me ajudar a descobrir por que isso está acontecendo? A conta de serviço está iam.serviceAccounts.actAsno Project Main, mas ela também precisa dessas permissões no Project Other ou a função de usuário do BigQuery é suficiente?

Responder1

Para consultar uma tabela, você precisa da permissãobigquery.tables.getData. A função que o usuário do BigQuery tembigquery.tables.list. Mude a função paraVisualizador de dados do BigQuery(roles/bigquery.dataViewer).

Papéis e permissões predefinidos do BigQuery

Para modificar/escrever uma tabela, você precisa da permissãobigquery.tables.updateData. Essa permissão está nas funções:

  • Administrador do BigQuery (roles/bigquery.admin)
  • Proprietário dos dados do BigQuery (roles/bigquery.dataOwner)
  • Editor de dados do BigQuery (roles/bigquery.dataEditor) <- papel recomendado.

informação relacionada