2

現在Google Cloud Storageバケットにファイルを書き込もうとしています。このため、私はdjango-storagesパッケージを使用しました。GCS、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' 
>>> 

バケットの権限と完全に関連していたようです。だから私はストレージ管理者、ストレージオブジェクトの作成者の役割をグーグルクラウドビルドサービスアカウント(バケット - >管理権限を介して)を割り当てたが、それでも同じエラーを示しています。

+0

クラスタ構成には、ストレージROスコープがあります。これが理由ですか? –

答えて

2

これは、クラスタに正しいスコープを割り当てていないと考えられます。この場合、クラスタ内のノードには、Google Cloud Storageに書き込むための必要な承認/許可がないため、表示されている403エラーを説明することができます。

クラスタの作成時にスコープが設定されていない場合、デフォルトのスコープが割り当てられ、Cloud Storageに対する読み取りアクセス権のみが与えられます。

あなたは、たとえば、クラウドシェルからコマンド「を記述する」を実行しようとすることができクラウドSDKを使用して、クラスタの現在のスコープをチェックするために:

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スイッチに続けて目的のスコープ識別子を使用して作成します。あなたの場合、これは "storage-rw"になります。たとえば、あなたが何かを実行できます。

のgcloudコンテナクラスタがZONE --zone CLUSTER-NAMEを作成するストレージ-RW

を--scopesあなたのサービスのアカウントと組み合わせstorage-rwスコープは、その後、あなたのノードを可能にしなければなりませんクラウドはCloud Storageに書き込みます。

クラスタを再作成したくない場合は、新しい目的のスコープで新しいノードプールを作成し、古いノードプールを削除できます。これを達成する方法については、受け入れられた回答Is it necessary to recreate a Google Container Engine cluster to modify API permissions?を参照してください。

+0

現在、3つのVMインスタンスが稼動していますが、3つすべてのスコープを追加する必要がありますか? –

+0

https://medium.com/google-cloud/updating-google-container-engine-vm-scopes-with-zero-downtime-50bff87e5f80私を助けます。新しいクラスタを作成する必要はありません。新しいスコープで十分だろう –

+0

@Avinash Raj良い点、これを指摘してくれてありがとう、私のポストの最後にいくつかの追加情報を追加しました。 – neilH

関連する問題