Да, это можно сделать с помощью Клиентских библиотек .
Вы можете проверить некоторые примеры в следующей документации .
Я сделал быстрый скрипт, который делает то, что вы запрашиваете:
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