🔨

Firebaseからsupabaseへの移行をしてみた【Authentication】

2024/03/10に公開

TL;DR

  • firebaseのauthenticationをパスワード情報含めてsupabaseに移行したかった
  • supabaseの方が運用コストも安いし、手っ取り早く一括で移行したい!

はじめに

去年(2023年)の11月頃から私が主催しているライブイベントにて、仲間内で使用するためのライブチケット管理アプリをFlutter x Firebaseで運用していましたが、ライブイベントが終わった後に来場者分析をしたり、アンケートを送りたくなってきた…
イベント運営者専用画面に分析ダッシュボードを作成しようとしてふと、「Firebaseってこれ運用コスト結構かかるんじゃ…?」

firebaseとsupabaseの料金の違い

https://note.com/geeksup_academy/n/n5ec33b6c3ed1
こちらの記事にかなり詳しくfirebaseとsupabaseの違いが書かれているので今回は料金の部分だけ引用するが、

Firebase
無料でユーザー数は無制限に追加できる
カスタム関数は従量課金のため無料では使えない
データベースのReadとWriteのタイミングで毎回課金される

Supabase
50,000アクティブユーザーまで無料
従量課金は基本的にデータの通信料と保存しているデータ容量のみ

設計したダッシュボードはリアルタイム更新を想定していたので、ふと「これダッシュボードはRead, Wirteがかなり加算されるのでは…?」と思ってしまった。
今後しばらく50,000アクティブユーザーを超えるようなことは起こり得ないので、無理なくサービス運営するためにもfirebaseからsupabaseに移行しよう!

早速移行してみる

さて、firebaseの画面に降り立ち、まずはユーザー情報から移行するべきだよなと決心。
現在のユーザー数は70名。しばらくはライブの予定もなく、サービスが動かない時期なのでやるなら善は急げだ!と思ったところで大きな壁。「パスワードってどうやって持っていくんだ…?」
残念ながら私はfirebaseに関してそこまで知識も深くないし、いくら運営者とはいえ当然ながらセキュリティの観点からfirebaseがユーザーのログインパスワードをホイホイ教えてくれることはないだろう。
ただ、supabaseはFlutterのDBとして最近注目を集めているし、当のsupabaseも自身のブログでfirebaseからの移行にいかがですか?的なことを言っていた。
これはもしやsupabaseがfirebaseからの移行手順を紹介してくれてたり…?

supabase公式が移行手順紹介してた

本当に紹介してた…
supabaseさん本気でした。
https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-auth
この記事を参考にしながら移行作業を進めることにする。

移行手順

前提条件としてgitとnode.jsのインストールは完了済みとして手順を記す。

  1. firebase-to-supabaseリポジトリをクローンする
git clone https://github.com/supabase-community/firebase-to-supabase.git
  1. /authディレクトリ内にsupabase-service.jsonをを作成
  • supabase-service-sample.jsonをコピーしてsupabase-service.jsonを作成
  • supabaseにログインして左のメニューバーからProject Settingsをクリック
  • 左メニューからDatabaseをクリック
  • Connection parametersのHost, Database name, Port, User, Passwordをsupabase-service.jsonに設定
  1. firebase-service.jsonをダウンロード
  • firebaseコンスールにログインしてプロジェクトを開く
  • メニューバーの歯車アイコンをクリックし、プロジェクトの設定をクリック
  • サービスアカウントをクリック
  • Firebase Admin SDKにて「新しい秘密鍵を生成」をクリックし、キーを作成をクリック
  • ダウンロードしたファイルをfirebase-to-supabase/authディレクトリに移動し、firebase-service.jsonに名前を変更する
  1. 依存関係をインストールする
npm install firebase-admin moment
  1. firebaseのパスワードハッシュパラメータを保存する
  • firebaseコンロールにログインし、プロジェクトを開く
  • Authenticationを開き、ユーザータブの右上の3点アイコンをクリック
  • メニューを開き、パスワードハッシュパラメータをクリック
  • firebase-to-supabase/auth/middleware/verify-firebase-pwディレクトリ内のlocal.env.sh.sampleをコピーし、local.env.shを作成
  • MEMCOST, ROUNDS, SALTSEPARATOR, SIGNERKEYをパスワードハッシュパラメータのものに変更
  • firebase-to-supabase/auth/middleware/verify-firebase-pwディレクトリ内のfly.toml.sampleをコピーし、fly.tomlを作成
  • MEMCOST, ROUNDS, SALTSEPARATOR, SIGNERKEYをパスワードハッシュパラメータのものに変更
  1. firestoreユーザーをJSONファイルにダンプする
node firestoreusers2json.js [<filename.json>] [<batch_size>]
  • filename.json:(任意)出力ファイル名(デフォルトだと./users.json)
  • batchSize:(任意)各バッチでフェッチするユーザー数(デフォルトは100)
  1. JSONユーザーファイルをSupabase Authにインポート(PostgreSQL:auth.users)
node import_users.js <path_to_json_file> [<batch_size>]
  • path_to_json_file:(必須)filename.jsonのパス
  • batch_size:(任意)バッチで処理するユーザーの数(デフォルトは100)

終わりに

実際にそこまで稼働するアプリではないので、余計な心配で終わってくれればよかったが、元々supabaseに多少興味があったので今回を機会にsupabaseをいじれるようにしたいなと思う。
気合いが続けばfirestoreの移行も備忘録として書こうかな

Discussion