🚨

Firestoreのプロジェクト間移行の権限周りでハマったのでメモ

2022/04/23に公開

https://firebase.google.com/docs/firestore/manage-data/move-data?hl=ja

ドキュメントに記載のある手順を試したところ権限エラーが出て実行できなかったので原因と解決法です。

1 エラーが起きた状況

ドキュメントに記載のある手順は以下です。この3PERMISSION_DENIEDのエラーが出ました。

  1. ソース プロジェクトのデータを保持する Cloud Storage バケットを作成します。
  2. ソース プロジェクトのデータをバケットにエクスポートします。
  3. 宛先プロジェクトにバケットから読み取りを許可する権限を付与します。
  4. バケットのデータを宛先プロジェクトにインポートします。

ドキュメントの権限付与に関する内容はこちら

ソース プロジェクトのデフォルトのサービス アカウントに、バケットへのアクセス権を付与する必要があります。各 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