Как я могу предоставить индивидуальные разрешения для пользователя в IAM для Bigquery с использованием Python
Я хочу дать ниже разрешение IAM для пользователя.
Разрешение:
BigQuery Job User
браузер
Я знаю, как я могу установить через Windows UI, но я хочу установить это разрешение IAM через скрипт Python?
1 ответ
Да, это можно сделать с помощью клиентских библиотек.
Вы можете проверить некоторые примеры в следующей документации.
Я сделал быстрый скрипт, который делает то, что вы запрашиваете:
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