Настройка доступа к набору данных BigQuery динамически - PullRequest
0 голосов
/ 07 мая 2018

У меня есть требование создать набор данных BigQuery во время выполнения и назначить необходимые роли во время выполнения. Использование сценариев Python для этого. Я искал в Google информацию о том, как обновить настройки доступа после создания набора данных, и наткнулся на следующее решение :

entry = bigquery.AccessEntry(
    role='READER',
    entity_type='userByEmail',
    entity_id='sample.bigquery.dev@gmail.com')
assert entry not in dataset.access_entries
entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ['access_entries'])  # API request

assert entry in dataset.access_entries

Мое требование - назначить несколько ролей для набора данных в зависимости от региона, для которого создан набор данных, как показано ниже:

"access": [
 {"role": "OWNER","groupByEmail": "gcp.abc.bigquery-admin@xyz.com"},
 {"role": "READER","groupByEmail": "gcp.def.bigdata@xyz.com"},
 {"role": "READER","groupByEmail": "gcp.ghi.bigquery@xyz.com"}]

Кто-нибудь может предложить лучший способ сделать это? Я думаю сохранить GroupByMail и Role в качестве ключа, пару значений в качестве словаря в файле конфигурации и читать и присваивать каждое значение по одному. Есть ли другой лучший способ сделать это? Любое предложение будет полезно.

1 Ответ

0 голосов
/ 08 мая 2018

Приведенный выше код подходит для назначения контроля доступа к набору данных во время создания набора данных BQ, но он не идеален для обновления доступа:

Допустим, если 'sample.bigquery.dev@gmail.com' уже имел role = 'OWNER , и вы запустите приведенный выше код, у вас будет две записи доступа, один с ролью ВЛАДЕЛЬЦА и один с ролью ЧИТАТЕЛЯ.

Чтобы обновить, вы, вероятно, захотите проверить, существует ли entity_id . Если не добавить запись, в противном случае перезаписать запись. (Вероятно, проще сделать это через BQ UI)

Теперь, сказав, что, если вам нужно назначить несколько ролей, у вас может быть список записей.

from google.cloud import bigquery
client = bigquery.Client()
dataset_id = 'test_dataset'

dataset_ref = client.dataset(dataset_id)
dataset = bigquery.Dataset(dataset_ref)
dataset.location = 'EU'
dataset = client.create_dataset(dataset)  

entries_list = [bigquery.AccessEntry('OWNER','groupByEmail','gcp.abc.bigquery-admin@xyz.com'),
                bigquery.AccessEntry('READER','groupByEmail', 'gcp.def.bigdata@xyz.com'),
                bigquery.AccessEntry('READER','groupByEmail', 'gcp.ghi.bigquery@xyz.com')]

entries = list(dataset.access_entries)
entries.extend(entries_list)
dataset.access_entries = entries
dataset = client.update_dataset(dataset, ['access_entries'])  # API request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...