Как я могу предоставить индивидуальные разрешения для пользователя в IAM для Bigquery с использованием Python - PullRequest
0 голосов
/ 22 января 2019

Я хочу дать ниже разрешение IAM для пользователя.

Разрешение:

Пользователь задания BigQuery
Браузер

Я знаю, как я могу установить через пользовательский интерфейс Windows, но я хочу установить это разрешение IAMчерез скрипт на питоне?

1 Ответ

0 голосов
/ 22 января 2019

Да, это можно сделать с помощью Клиентских библиотек .

Вы можете проверить некоторые примеры в следующей документации .

Я сделал быстрый скрипт, который делает то, что вы запрашиваете:

from google.oauth2 import service_account
import googleapiclient.discovery


credentials = service_account.Credentials.from_service_account_file(
    filename='PATH/TO/KEY.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])
service = googleapiclient.discovery.build(
    'cloudresourcemanager', 'v1', credentials=credentials)



def modify_policy_add_member(policy, role, member):
    binding = next(b for b in policy['bindings'] if b['role'] == role)
    binding['members'].append(member)
    print(binding)
    return policy

def create_role_add_member(policy, role, member):
    """Adds a new member to a role binding."""
    binding = {
                'role': role,
                'members': [member]
            }
    print(binding)
    policy['bindings'].append(binding)
    return policy

if __name__ == "__main__":
    project_id="YOUR_PROJECT_ID"
    policy=service.projects().getIamPolicy(
                resource=project_id,
                body={},
            ).execute()
    role="roles/bigquery.dataViewer" #example role to grant user
    member="user:MEMBER_TO_ADD"
    roles = [b['role'] for b in policy['bindings']]
    if role  in roles:
        new_policy = modify_policy_add_member(policy, role, member)
    else:
        new_policy = create_role_add_member(policy, role, member)
    print(new_policy)
    policy = service.projects().setIamPolicy(
            resource=project_id,
            body={
                'policy': new_policy,
    }).execute()

Разбивая его по частям, скрипт выполняет следующее:

1- Аутентификация в API с использованием файла ключа учетной записи службы с областями действия https://www.googleapis.com/auth/cloud-platform. В этом примере я использовал файл ключа учетной записи службы с разрешениями project/owner.

from google.oauth2 import service_account
import googleapiclient.discovery

credentials = service_account.Credentials.from_service_account_file(
    filename='PATH/TO/KEY.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])
service = googleapiclient.discovery.build(
    'cloudresourcemanager', 'v1', credentials=credentials)

2- Получить текущую политику проекта:

 policy=service.projects().getIamPolicy(
                resource=project_id,
                body={},
            ).execute()

3 - Установите роль для предоставления, которую в BigQuery вы можете увидеть в этом списке . Кроме того, установите добавление участника в формате user:<USER_ADDRESS>, вам нужно оставить строку user: перед добавлением учетной записи, если только вы не добавляете служебную учетную запись, тогда вы должны изменить user: на serviceaccount: .

4- Проверьте, существует ли роль, если она существует, просто добавьте участника к существующей роли:

def modify_policy_add_member(policy, role, member):
    binding = next(b for b in policy['bindings'] if b['role'] == role)
    binding['members'].append(member)
    print(binding)
    return policy

В противном случае создайте роль и добавьте ее к привязкам политики:

def create_role_add_member(policy, role, member):
    """Adds a new member to a role binding."""
    binding = {
                'role': role,
                'members': [member]
            }
    print(binding)
    policy['bindings'].append(binding)
    return policy

5 - Обновите политику в вашем проекте, отправив обновленную политику:

policy = service.projects().setIamPolicy(
            resource=project_id,
            body={
                'policy': new_policy,
    }).execute()

Обратите внимание, что для использования этого API в Python вам необходимо установить следующие модули:

google-api-python-client==1.7.4
google-auth==1.5.1
google-auth-httplib2==0.0.3
...