【问题标题】:GCS with GKE, 403 Insufficient permission for writing into GCS bucket [duplicate]GCS with GKE,403 Insufficient permission for write into GCS bucket [重复]
【发布时间】:2018-04-15 18:37:21
【问题描述】:

目前我正在尝试将文件写入 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'
>>>

似乎它与存储桶权限完全相关。因此,我已将 Storage admin 、 Storage object creator 角色分配给 google cloud build 服务帐户(通过存储桶-> 管理权限),但仍然显示相同的错误。

【问题讨论】:

  • 在集群配置上有一个存储 RO 范围。是这个原因吗?

标签: python django google-cloud-platform google-cloud-storage google-kubernetes-engine


【解决方案1】:

对此的一种可能解释是,如果您没有为集群分配正确的范围。如果是这种情况,集群中的节点将没有写入 Google Cloud Storage 所需的授权/权限,这可以解释您看到的 403 错误。

如果在创建集群时没有设置范围,则分配默认范围,这仅提供对云存储的读取权限。

为了使用 Cloud SDK 检查集群的当前范围,您可以尝试从 Cloud Shell 运行“描述”命令,例如:

gcloud container clusters describe CLUSTER-NAME --zone ZONE

输出的 oauthScopes 部分包含分配给集群/节点的当前范围。

默认的只读云存储范围会显示:

https://www.googleapis.com/auth/devstorage.read_only

如果设置了 Cloud Storage 读/写范围,输出将显示:

https://www.googleapis.com/auth/devstorage.read_write

可以在集群创建期间使用 --scope 开关后跟所需的范围标识符来设置范围。在您的情况下,这将是“storage-rw”。例如,您可以运行如下内容:

gcloud 容器集群创建 CLUSTER-NAME --zone ZONE --scopes storage-rw

storage-rw 范围与您的服务帐户相结合,然后应该允许集群中的节点写入云存储。

或者,如果您不想重新创建集群,您可以使用新的所需范围创建一个新的节点池,然后删除您的旧节点池。有关如何实现此目的的信息,请参阅Is it necessary to recreate a Google Container Engine cluster to modify API permissions? 的公认答案。

【讨论】:

  • 目前我们有 3 个 VM 实例启动并运行,是否必须在所有三个中添加范围?
  • medium.com/google-cloud/… 帮助我.. 我们不需要创建新集群,只需创建具有新范围的节点就足够了
  • @Avinash Raj 好点,我在帖子末尾添加了一些额外信息来解决这个问题,感谢您指出这一点。
猜你喜欢
  • 2022-11-12
  • 2021-03-07
  • 1970-01-01
  • 2015-11-15
  • 2015-02-27
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多