中野智文のブログ

データ・マエショリストのメモ

FirebaseのRTDBからFireStoreに乗り換えるためにGCPのプロジェクトを作成したときのメモ

背景

GCPのプロジェクトの中では、Firebaseのストレージは、排他的で、RTBDかFirestoreのどちらしか選べないらしい。 強制的にFirestore にする手もあるが、戻れなくなるのも嫌なので、新しくGCPのプロジェクトを作ることにした。 なお、Firebaseのプロジェクトという言葉と、GCPのプロジェクトいう言葉があって紛らわしい。

対応

普通に作った。ただ、ユーザの設定を元のGCPのプロジェクトから引き継ぎたい。継承という文字列が見えるが別のプロジェクトから継承するものではないらしい。

またrole(役割)のコピーというコマンドも見つかったりするかもしれないが、割り当てられた状態をコピーするのではなく、role(役割)そのものをコピーするものなので関係がない。

答えは、 iam-policy を入手すること。 次のコマンドで得られる。

gcloud projects get-iam-policy OLD_PROJECT_ID > iam-policy.yaml

サービスアカウントも含まれているので、editor などで、不必要な項目は消す。 etag や version も消さないと、

ERROR: (gcloud.projects.set-iam-policy) Resource in project [xxx-xxx-xxx:setIamPolicy] is the subject of a conflict: There were concurrent policy changes. Please retry the whole read-modify-write wit
h exponential backoff.

みたなエラーが出る。

次に新しいGCPプロジェクトを作成し、そのプロジェクトに読み込ませる。

gcloud projects set-iam-policy NEW_PROJECT_ID iam-policy.yaml

etagやバージョンが消されていれば(バージョンは新しい番号をふってもいいかも)

The specified policy does not contain an "etag" field identifying a
specific version to replace. Changing a policy without an "etag" can
overwrite concurrent policy changes.

Replace existing policy (Y/n)?  

みたいなメッセージが出るので、エンターを押して実行する。

以上で別プロジェクトのユーザの設定が引き継がれているはずだ。

まとめ

別のGCPプロジェクトからユーザをコピーするときは gcloud projects get-iam-policygcloud projects set-iam-policy を使う。