Рейтинг:0

Доступ к данным BigQuery из другого проекта в той же организации с помощью сервисного аккаунта

флаг ng

У меня возникли серьезные проблемы с подключением официального клиента BigQuery (на Python 3) к другому проекту в той же организации, авторизованному сервисом Cloud Run.

Служба Cloud Run находится в Project Main, и я пытаюсь получить доступ к таблице в Project Other — оба этих проекта находятся в одной организации.

Учетная запись службы была созданной пользователем учетной записью службы, созданной в Project Main (а ​​не по умолчанию), и имеет все необходимые разрешения для запуска в качестве учетной записи службы в Project Main, а электронной почте учетной записи службы была предоставлена ​​​​только роль «Пользователь BigQuery». в Проекте Другое.

В Python у меня есть такой фрагмент кода:

из google.cloud импортировать bigquery

query_str = "ВЫБЕРИТЕ * ИЗ `project_other.prod.table`"

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

Это выполняется внутри контейнера, развернутого в Cloud Run в основном проекте, и к развертыванию привязана правильная учетная запись службы.

При запуске сценария я получаю исключение, подобное следующему:

поднять self._exception google.api_core.exceptions.BadRequest: 400 Отказано в доступе: Таблица
project_other:prod.table: у пользователя нет разрешения запрашивать таблицу project_other:prod.table. в [4:13]

Насколько я понимаю, если учетная запись службы, подключенная к развертыванию Cloud Run, имеет необходимые разрешения, вам не нужно выполнять какую-либо причудливую аутентификацию в контейнере, поскольку все это «сделано за вас» управляемой службой.

Может кто-нибудь, пожалуйста, помогите мне понять, почему это происходит? Сервисный аккаунт имеет iam.serviceAccounts.actAs в Project Main, но нужны ли эти разрешения и в Project Other, или достаточно роли пользователя BigQuery?

John Hanley avatar
флаг cn
Чтобы запросить таблицу, вам необходимо разрешение **bigquery.tables.getData**. Роль **Пользователь BigQuery** имеет **bigquery.tables.list**. Попробуйте изменить роль на **BigQuery Data Viewer** (roles/bigquery.dataViewer). https://cloud.google.com/bigquery/docs/access-control#bigquery
bandwagoner avatar
флаг ng
@JohnHanley Это решило проблему, большое спасибо! Просто чтобы добавить еще один момент, которого не было в моем первоначальном вопросе, для записи в любые таблицы мне также нужно было предоставить учетной записи службы роль редактора данных BigQuery. Если вы не против добавить свой комментарий в качестве решения, я с радостью приму его.
Рейтинг:0
флаг cn

Чтобы запросить таблицу, вам нужно разрешение bigquery.tables.getData. Роль пользователя BigQuery bigquery.tables.list. Сменить роль на Средство просмотра данных BigQuery (роли/bigquery.dataViewer).

Предопределенные роли и разрешения BigQuery

Чтобы изменить/записать таблицу, вам необходимо разрешение bigquery.tables.updateData. Это разрешение находится в ролях:

  • Администратор BigQuery (роли/bigquery.admin)
  • Владелец данных BigQuery (roles/bigquery.dataOwner)
  • Редактор данных BigQuery (roles/bigquery.dataEditor) <- рекомендуемая роль.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.