GCS с GKE, 403 недостаточное разрешение для записи в ведро GCS [дубликат]
На этот вопрос уже есть ответ здесь:
В настоящее время я пытаюсь записывать файлы в корзину Google Cloud Storage. Для этого я использовал пакетdjango-storages .
Я развернул свой код и приступаю к работе. контейнер через утилиту kubernetes kubectl для проверки работы ковша GCS.
$ kubectl exec -it foo-pod -c foo-container --namespace=testing python manage.py shell
Я могу прочитать ведро, но если я попытаюсь написать в ведро,это покажет нижеприведенную обратную связь.
>>> from django.core.files.storage import default_storage
>>> f = default_storage.open('storage_test', 'w')
>>> f.write('hi')
2
>>> f.close()
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/google/cloud/storage/blob.py", line 946, in upload_from_file
client, file_obj, content_type, size, num_retries)
File "/usr/local/lib/python3.6/site-packages/google/cloud/storage/blob.py", line 867, in _do_upload
client, stream, content_type, size, num_retries)
File "/usr/local/lib/python3.6/site-packages/google/cloud/storage/blob.py", line 700, in _do_multipart_upload
transport, data, object_metadata, content_type)
File "/usr/local/lib/python3.6/site-packages/google/resumable_media/requests/upload.py", line 98, in transmit
self._process_response(result)
File "/usr/local/lib/python3.6/site-packages/google/resumable_media/_upload.py", line 110, in _process_response
response, (http_client.OK,), self._get_status_code)
File "/usr/local/lib/python3.6/site-packages/google/resumable_media/_helpers.py", line 93, in require_status_code
status_code, u'Expected one of', *status_codes)
google.resumable_media.common.InvalidResponse: ('Request failed with status code', 403, 'Expected one of', <HTTPStatus.OK: 200>)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/storages/backends/gcloud.py", line 75, in close
self.blob.upload_from_file(self.file, content_type=self.mime_type)
File "/usr/local/lib/python3.6/site-packages/google/cloud/storage/blob.py", line 949, in upload_from_file
_raise_from_invalid_response(exc)
File "/usr/local/lib/python3.6/site-packages/google/cloud/storage/blob.py", line 1735, in _raise_from_invalid_response
raise exceptions.from_http_response(error.response)
google.api_core.exceptions.Forbidden: 403 POST https://www.googleapis.com/upload/storage/v1/b/foo.com/o?uploadType=multipart: Insufficient Permission
>>> default_storage.url('new docker')
'https://storage.googleapis.com/foo.appspot.com/new%20docker'
>>>
Похоже, что это было полностью связано с разрешениями ведра. Поэтому я назначил роли администратора хранилища, создателя объектов хранения для учетной записи Google cloud build service (через bucket - > manage permissions), но все равно он показывает ту же ошибку.
1 ответ:
Возможным объяснением этого может быть то, что вы не назначили кластеру правильную область видимости. Если это так, узлы в кластере не будут иметь необходимых полномочий / разрешений для записи в облачное хранилище Google, что может объяснить ошибку 403, которую вы видите.
Если при создании кластера не задана область, назначается область по умолчанию, которая предоставляет только разрешение на чтение для облачного хранилища.
Для проверки текущих областей видимости кластеров с помощью Cloud SDK можно попробовать выполнить команду "describe" из облачной оболочки, например:
gcloud container clusters describe CLUSTER-NAME --zone ZONEРаздел вывода oauthScopes содержит текущие области, назначенные кластеру/узлам.
Область облачного хранилища только для чтения по умолчанию будет отображаться:
https://www.googleapis.com/auth/devstorage.read_onlyЕсли задана область чтения/записи облачного хранилища, вывод будет выглядеть следующим образом:
https://www.googleapis.com/auth/devstorage.read_writeОбласть действия можно задать при создании кластера с помощью переключателя --scope, за которым следует требуемый идентификатор области действия. В в вашем случае это будет "хранилище-rw". Например, вы можете запустить что-то вроде:
Контейнер Gcloud кластера создание кластера-имя --зона --объемы хранения РАО
Область
storage-rwв сочетании с учетной записью службы должна позволить узлам кластера выполнять запись в облачное хранилище.Кроме того, если вы не хотите воссоздавать кластер, вы можете создать новый пул узлов с новыми требуемыми областями, а затем удалить старый пул узлов. Смотрите принятый ответ для необходимо ли воссоздать кластер Google Container Engine, чтобы изменить разрешения API? для получения информации о том, как этого достичь.
Comments