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