У меня возникли серьезные проблемы с установкой официального клиента BigQuery (на Python 3) в другом проекте в той же организации, авторизованном через сервис Cloud Run.
Служба Cloud Run находится в Project Main, а я пытаюсь получить доступ к таблице в Project Other — оба эти проекта находятся в одной организации.
Учетная запись службы была создана пользователем в Project Main (не по умолчанию) и имела все необходимые разрешения для запуска в качестве учетной записи службы в Project Main, а электронной почте учетной записи службы была предоставлена только роль «Пользователь BigQuery» в Project Other.
В 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
в Project Main, но нужны ли ей эти разрешения и в Project Other, или достаточно роли BigQuery User?
решение1
Для запроса таблицы вам необходимо разрешениеbigquery.tables.getData. Роль пользователя BigQuerybigquery.tables.list. Изменить роль наПросмотрщик данных BigQuery(роли/bigquery.dataViewer).
Предопределенные роли и разрешения BigQuery
Для изменения/записи таблицы вам необходимо разрешениеbigquery.tables.updateData. Это разрешение есть в ролях:
- Администратор BigQuery (roles/bigquery.admin)
- Владелец данных BigQuery (roles/bigquery.dataOwner)
- Редактор данных BigQuery (roles/bigquery.dataEditor) <- рекомендуемая роль.