Разрешение на облачное хранилище Google через служебную учетную запись в Python

Я пытаюсь получить учетную запись службы для создания больших двоичных объектов в Google Cloud Storage из сценария Python, но у меня возникают проблемы с учетными данными.

1) Я создаю учетную запись службы для своего проекта, а затем загружаю ключевой файл в формате json:

"home/user/.config/gcloud/service_admin.json"

2) Я даю учетной записи службы необходимые учетные данные (через gcloud в подпроцессе)

 roles/viewer, roles/storage.admin,  roles/resourcemanager.projectCreator, roles/billing.user

Затем я хотел бы получить доступ к корзине в GCS

from google.cloud import storage
import google.auth

credentials, project = google.auth.default()
client = storage.Client('myproject', credentials=credentials)
bucket = client.get_bucket('my_bucket')

К сожалению, это приводит к:

google.api_core.exceptions.Forbidden: 403 GET
https://www.googleapis.com/storage/v1/b/my_bucket?projection=noAcl:
[email protected] does not have
storage.buckets.get access to my_bucket

Мне повезет больше, если я установлю переменную окружения

export GOOGLE_APPLICATION_CREDENTIALS="home/user/.config/gcloud/service_admin.json"

и перезапустите сценарий. Однако я хочу, чтобы все это выполнялось в одном экземпляре скрипта, который создает учетные записи и продолжает создавать необходимые файлы в корзинах. Как мне получить доступ к my_bucket, если я знаю, где находится мой файл учетных данных json.


person Mike    schedule 04.03.2019    source источник


Ответы (1)


Попробуйте этот пример из документации для аутентификации между серверами:

from google.cloud import storage

# Explicitly use service account credentials by specifying the private key file.
storage_client = storage.Client.from_service_account_json('service_account.json')

# Make an authenticated API request
buckets = list(storage_client.list_buckets())
print(buckets)

Таким образом вы указываете файл, содержащий ключ учетной записи службы, прямо в коде.

person TasosZG    schedule 04.03.2019
comment
Это работает! На самом деле моя ошибка заключалась в том, что я имел в виду корзину [client.lookup_bucket ('my_bucket'), которая была создана в предыдущем проекте и теперь удалена; отсюда вопрос о разрешении]. - person Mike; 04.03.2019