Tengo serios problemas para llevar el cliente oficial de BigQuery (en Python 3) a un proyecto diferente en la misma organización autorizado desde un servicio Cloud Run.
El servicio Cloud Run está en el Proyecto principal y estoy intentando acceder a una tabla en el Proyecto Otro; ambos proyectos están en la misma organización.
La cuenta de servicio era una cuenta de servicio creada por el usuario en Project Main (no la predeterminada) y tiene todos los permisos necesarios para ejecutarse como una cuenta de servicio en Project Main, y al correo electrónico de la cuenta de servicio solo se le asignó la función "Usuario de BigQuery". en Proyecto Otro.
En Python, tengo un fragmento 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()
Esto se ejecuta dentro del contenedor implementado en Cloud Run en el proyecto principal y la implementación tiene adjunta la cuenta de servicio correcta.
Al activar el script, termino con una excepción como la siguiente:
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]
Por lo que tengo entendido, si la cuenta de servicio adjunta a la implementación de Cloud Run tiene los permisos necesarios, no es necesario realizar ninguna autenticación sofisticada en el contenedor, ya que el servicio administrado lo "hace todo por usted".
¿Alguien puede ayudarme a descubrir por qué sucede esto? La cuenta de servicio está iam.serviceAccounts.actAs
en el Proyecto principal, pero ¿necesita también esos permisos en el Proyecto Otro o es suficiente la función de Usuario de BigQuery?
Respuesta1
Para consultar una tabla, necesita el permiso.bigquery.tables.getData. El rol que tiene el usuario de BigQuerybigquery.tables.list. Cambiar el rol aVisor de datos de BigQuery(roles/bigquery.dataViewer).
Roles y permisos predefinidos de BigQuery
Para modificar/escribir una tabla, necesita el permisobigquery.tables.updateData. Ese permiso está en los roles:
- Administrador de BigQuery (roles/bigquery.admin)
- Propietario de datos de BigQuery (roles/bigquery.dataOwner)
- BigQuery Data Editor (roles/bigquery.dataEditor) <- rol recomendado.