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.actAs
no 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.