2

현재 Google 클라우드 저장소 버킷에 파일을 쓰려고합니다. 이를 위해 django-storages 패키지를 사용했습니다.GCS가있는 GCS, 403 GCS 버킷에 쓰기위한 권한이 충분하지 않습니다.

코드를 배포했으며 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 클라우드 빌드 서비스 계정 (버킷 -> 권한 관리)을 통해 할당했지만 여전히 동일한 오류를 보여줍니다.

+0

클러스터 구성에는 저장소 RO 범위가 있습니다. 그게 이유 야? –

답변

2

올바른 범위로 클러스터를 할당하지 않은 경우이 설명이 가능합니다. 이 경우 클러스터의 노드에는 Google Cloud Storage에 쓸 수있는 권한/권한이 없기 때문에 표시되는 403 오류를 설명 할 수 있습니다.

클러스터를 만들 때 범위를 설정하지 않으면 기본 범위가 할당되며 Cloud Storage에 대한 읽기 권한 만 제공됩니다.

gcloud container clusters describe CLUSTER-NAME --zone ZONE 

출력의 oauthScopes 섹션이 할당 된 현재 범위를 포함 예를 들어, 당신은이 클라우드 쉘에서 명령을 '설명'실행을 시도 할 수 클라우드 SDK를 사용하여 클러스터의 현재 범위를 확인하기 위해

클러스터/노드. 클라우드 스토리지/쓰기 범위가 출력이 표시됩니다 설정 읽으면

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

:

은 기본은 클라우드 스토리지의 범위를 표시 할 읽기 범위는 클러스터 중에 설정할 수 있습니다

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

--scope 스위치 다음에 원하는 범위 식별자를 사용하여 생성합니다. 귀하의 경우, 이것은 "스토리지 -RW"가됩니다. 예를 들어, 같은 실행할 수 있습니다 : --zone의 ZONE 저장-RW

서비스 계정과 결합 된 storage-rw 범위는 다음에 노드를 허용해야을 --scopes

gcloud 컨테이너 클러스터는 클러스터 이름을 만들 당신의 cluster를 사용하여 Cloud Storage에 저장합니다.

클러스터를 다시 만들지 않으려면 새 원하는 범위로 새 노드 풀을 만든 다음 이전 노드 풀을 삭제할 수 있습니다. 이를 달성하는 방법에 대한 정보는 Is it necessary to recreate a Google Container Engine cluster to modify API permissions?에 대한 대답을 참조하십시오.

+0

현재 3 개의 VM 인스턴스가 실행 중입니다.이 세 가지 모두에 스코프를 추가해야합니까? –

+0

https://medium.com/google-cloud/updating-google-container-engine-vm-scopes-with-zero-downtime-50bff87e5f80 나를 돕습니다 .. 우리는 새로운 클러스터를 만들 필요가 없습니다. 새로운 범위가 충분할 것입니다. –

+0

@Avinash Raj 좋은 지적입니다.이를 지적하기 위해 게시물 끝에 추가 정보를 추가했습니다. 감사합니다. – neilH

관련 문제