Назад | Перейти на главную страницу

У служебного аккаунта нет доступа к хранилищу .buckets.get.

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

from google.cloud import storage

storage_client = storage.Client(project='[project-id]')
bucket = storage_client.get_bucket([bucket-name])

blobs = bucket.list_blobs()

for blob in blobs:
    print(blob.name)

Но я получаю сообщение об ошибке:

[service-account-ID]-compute@developer.gserviceaccount.com does not have storage.buckets.get access to [bucket-name]

В любом случае, если я попробую использовать gsutil (используя ту же учетную запись службы):

gsutil ls gs://[bucket-name]

Я могу получить список объектов в корзине ... Итак, я не понимаю, что происходит, есть какие-то подсказки о том, что мне делать?

GCP имеет концепцию роли и разрешения. А роль это что-то вроде Storage Admin (roles/storage.admin) и разрешение что-то вроде storage.buckets.get. Роли состоят из одного или нескольких разрешений. Разрешения всегда предоставляются путем применения роли к участнику (пользователю, учетной записи службы или группе), то есть вы не можете назначить разрешение непосредственно участнику.

Вы видите ошибку, потому что разрешение storage.buckets.get отсутствует в учетной записи службы - то есть ни одна из ролей, примененных к учетной записи службы, не предоставляет разрешение storage.buckets.get. Вы можете перечислить объекты корзины (разрешение storage.objects.list) без возможности перечисления сегментов (разрешение storage.buckets.get).

Поэтому вам нужно назначить роль, например roles/storage.admin у которого есть разрешение storage.buckets.get. Вы также можете создать Пользовательская роль с этим разрешением, если вы хотите работать с моделью с наименьшими привилегиями.