Как вывести списки из Google Storage в Python? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующий код в скрипте Python:

from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = 'JSON_AUTH_FILE'
credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = SERVICE_ACCOUNT_FILE

Это делает аутентификацию с Google.

Теперь я хочу перечислить все сегменты:

from google.cloud import storage
storage_client = storage.Client()
buckets = list(storage_client.list_buckets())
print(buckets)

Но это не работает. Я получаю:

google.api_core.exceptions.Forbidden: 403

xxx@yyy.iam.gserviceaccount.com does not have storage.buckets.list access to project

У меня также есть ссылка, когда я нажимаю на нее, я вижу (что странно, потому что там написано 403, а здесь показано 401:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Anonymous caller does not have storage.buckets.list access to project NUMBER.",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Anonymous caller does not have storage.buckets.list access to project NUMBER."
 }
}

Что я делаю не так?

1 Ответ

0 голосов
/ 02 июля 2018

Несколько вещей, чтобы предложить в ссылке на эту ссылку: https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-python

Существует несколько способов установки ролей для учетных записей служб для доступа к Хранилищу Google: https://cloud.google.com/iam/docs/understanding-roles#cloud_storage_roles

Использование роли по умолчанию при создании учетной записи службы

При создании учетной записи службы выберите Роль проекта: Хранилище -> Администратор хранилища . Установка этой роли позволит вашей учетной записи службы получать доступ и управлять объектами из облачного хранилища. Использование роли Storage Admin гарантирует, что вы предоставите наименьшее количество привилегий учетной записи службы, чтобы она не могла получить доступ к другим службам.

Если у вас есть проблемы с аутентификацией, возможно, посмотрите на настройку роли Проект -> Редактор , которая должна предоставить доступ к редактированию учетной записи службы большинству служб GCP. Просто имейте в виду, что если учетная запись службы скомпрометирована, пользователь получит доступ к большинству ваших услуг в проекте GCP.

Использование пользовательской роли для наследования нескольких ролей

Устанавливая пользовательскую роль, вы можете наследовать разрешения, предоставленные ряду ролей по умолчанию. Хороший способ сделать это - использовать «Создать роль из выделения» в разделе IAM & Admin -> Roles консоли GCP.

Например, вы можете объединить BigQuery Admin и Storage Object Admin в одну настраиваемую роль, установив флажки для каждой роли и создав собственную настраиваемую роль, которую вы можете использовать. затем выделите свою учетную запись службы в разделе IAM GCP .


Если у вас есть служебная учетная запись с правильными разрешениями, вы сможете установить переменную среды GOOGLE_APPLICATION_CREDENTIALS и использовать библиотеку google для доступа к своим хранилищам.

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

import os
from google.cloud import storage

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "/home/user/Downloads/[FILE_NAME].json"

# Instantiates a client
storage_client = storage.Client()

# List all the buckets available
for bucket in storage_client.list_buckets():
    print(bucket)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...