🚨
Firestoreのプロジェクト間移行の権限周りでハマったのでメモ
ドキュメントに記載のある手順を試したところ権限エラーが出て実行できなかったので原因と解決法です。
1 エラーが起きた状況
ドキュメントに記載のある手順は以下です。この3でPERMISSION_DENIED
のエラーが出ました。
- ソース プロジェクトのデータを保持する Cloud Storage バケットを作成します。
- ソース プロジェクトのデータをバケットにエクスポートします。
- 宛先プロジェクトにバケットから読み取りを許可する権限を付与します。
- バケットのデータを宛先プロジェクトにインポートします。
ドキュメントの権限付与に関する内容はこちら
ソース プロジェクトのデフォルトのサービス アカウントに、バケットへのアクセス権を付与する必要があります。各 Google Cloud プロジェクトには、PROJECT_ID@appspot.gserviceaccount.com という名前のデフォルトのサービス アカウントが自動的に作成されています。
gsutil iam ch serviceAccount:[SOURCE_PROJECT_ID]@appspot.gserviceaccount.com:admin \
gs://[BUCKET_NAME]
↑を実行すると以下のエラーが出ました。
PERMISSION_DENIED: Service account does not have access to Google Cloud Storage file: /[bucket]/[outputURIPrefix].overall_export_metadata. See https://cloud.google.com/datastore/docs/export-import-entities#permissions for a list of permissions needed. Error details: service-[number]@gcp-sa-firestore.iam.gserviceaccount.com does not have storage.buckets.get access to the Google Cloud Storage bucket.
2 原因
PROJECT_ID@appspot.gserviceaccount.com
のアカウントに権限を付与していたのですがエラー内容ではservice-[number]@gcp-sa-firestore.iam.gserviceaccount.com
に権限がないとのこと。
Firestoreのインポートはservice-[number]@gcp-sa-firestore.iam.gserviceaccount.com
アカウントで行われるようです。このアカウントはimportしたいバケットの権限ページから確認できます。
こちらのページの下にあります。※↓のページを開いたら下の方にスクロールすると見つけられます
3 解決法
service-[number]@gcp-sa-firestore.iam.gserviceaccount.com
アカウントに権限付与し、再度インポートを実行(1の手順4)したところ成功。権限付与するコマンドは以下。
gsutil iam ch serviceAccount:service-[number]@gcp-sa-firestore.iam.gserviceaccount.com:admin \
gs://[BUCKET_NAME]
Discussion