Push-файл GCP Cloud Storage с помощью json-файла служебной учетной записи - PullRequest
3 голосов
/ 13 марта 2019

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

Я перепроверил данный доступ, предоставив java-программу и gsutil. В обоих этих местах я могу получить доступ к ведру и загрузить файл. Проблема с программой Python. Пожалуйста, покажите немного света по этому вопросу.

from google.oauth2 import service_account
from google.cloud import storage

credentials = service_account.Credentials.from_service_account_file('C:/Users/AWS/python/sit.json'
    ,scopes=['https://www.googleapis.com/auth/cloud-platform'])
storage_client = storage.Client(credentials=credentials,project='proj-sit')  
bucket = storage_client.get_bucket('b-sit')
blob = bucket.blob('myfile')
blob.upload_from_string('New contents!. This is test.')

и я получил ошибку ниже

  Traceback (most recent call last):
  File "C:\Users\AWS\python\mypgm.py", line 21, in <module>
    bucket = storage_client.get_bucket('pearson-gcss-sit') # pearson-gcss-sit  pearson-bbi-dev global-integration-nonprod
  File "D:\Development_Avecto\Python36\lib\site-packages\google\cloud\storage\client.py", line 227, in get_bucket
    bucket.reload(client=self)
  File "D:\Development_Avecto\Python36\lib\site-packages\google\cloud\storage\_helpers.py", line 106, in reload
    method="GET", path=self.path, query_params=query_params, _target_object=self
  File "D:\Development_Avecto\Python36\lib\site-packages\google\cloud\_http.py", line 319, in api_request
    raise exceptions.from_http_response(response)
google.api_core.exceptions.Forbidden: 403 GET https://www.googleapis.com/storage/v1/b/b-sit?projection=noAcl: someid-sit@someinfo-sit.iam.gserviceaccount.com does not have storage.buckets.get access to b-sit.
[Finished in 10.6s]

Примечание. Я вижу роль как storage.objectAdmin в console.cloud.google.com.

Для получения дополнительной информации я могу загрузить файлы, используя нижеприведенную Java-программу.

GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(connectionKeyPath))
                                .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
                        Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
                        BlobId blobId = BlobId.of("some-sit", "cloudDirectory/file.zip");
                        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("application/zip").build();
                        Blob blob = storage.create(blobInfo, fileContent);

Я получил основную причину проблемы.

Основная причина: мой контейнер имеет доступ к «role / storage.objectAdmin», который не имеет доступа к «storage.buckets.get». Следовательно, я получаю вышеуказанную ошибку в строке, где у меня есть функция get_bucket. Это я нашел в google документации .

Все примеры кодов в документации имеют функцию get_bucket для загрузки файлов. Мои вопросы, как мы можем загрузить файлы в корзину без этого доступа (storage.buckets.get)? Потому что мы загрузили в ту же корзину Java без этого доступа.

Можете ли вы пролить свет на это? пожалуйста

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Используемая учетная запись службы не имеет надлежащих разрешений .

. Эту проблему можно решить, предоставив по крайней мере роль roles/storage.objectAdmin на уровне сегмента или проекта.

Роль roles/storage.objectAdmin :

Предоставляет полный контроль над объектами, включая перечисление, создание, просмотр и удаление объектов.

Для предоставление на уровне корзины Выполнение:

gsutil iam ch serviceAccount:someid-sit@someinfo-sit.iam.gserviceaccount.com:roles/storage.objectAdmin gs://[BUCKET_NAME]

Для Предоставление на уровне проекта Выполнение:

gcloud projects add-iam-policy-binding yourProject --member serviceAccount:someid-sit@someinfo-sit.iam.gserviceaccount.com --role roles/storage.objectAdmin

РЕДАКТИРОВАТЬ :

Вам необходимо передать учетные данные в storage_client:

storage_client = storage.Client('proj-sit', credentials=credentials)

1 голос
/ 15 марта 2019

Я удалил строку, чтобы получить корзину в моем коде, и добавил строку ниже.Ниже линия сделала мне трюк.Следовательно, я могу загрузить файл с доступом 'role / storage.objectAdmin'

bucket = storage_client.bucket('b-sit')
...