概要
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を使い続ける