概要
gsutil cp
で GCS にファイルをアップロードする処理を gcloud storage cp
に切り替えたら、一部のファイルのアップロードで Permission 'storage.buckets.get' denied
が発生するようになった。
$ gcloud storage cp *.tar gs://my-bucket/
ERROR: (gcloud.storage.cp) User [my-service-account@my-project.iam.gserviceaccount.com] does not have permission to access b instance [my-bucket] (or it may not exist): my-service-account@my-project.iam.gserviceaccount.com does not have storage.buckets.get access to the Google Cloud Storage bucket. Permission 'storage.buckets.get' denied on resource (or it may not exist).
- 対象の Bucket に対しての
roles/storage.objectCreator
はちゃんと付与されいていて、gsutil
では問題なかった。 - ファイルサイズが大きい場合にだけ発生しているっぽかった。
原因
並列複合アップロード のデフォルトの仕様が gsutil
と異なっていた。
gsutil
だとデフォルトで並列複合アップロードは無効になっているが、gcloud storage
だと有効になっていて、大きいファイルをアップロードしようとすると自動で切り替わるらしい。。。
対処方法
以下のどれか。
- 言われた通り Bucket に対する
storage.buckets.get
権限を付与する- 事前定義ロールだと
roles/storage.legacyBucketReader
あたりで OK
- 事前定義ロールだと
- 安全チェックを無効にする
gcloud config set storage/parallel_composite_upload_compatibility_check false
- 並列複合アップロードを無効にする(
gsutil cp
と同等になる)gcloud config set storage/parallel_composite_upload_enabled false
-
gsutil cp
を使い続ける