Firebaseのプロジェクト移行に伴う、RemoteConfigの移行手順

f:id:mizonit:20210208232041p:plain

はじめまして。株式会社mikanでエンジニアしている @hoshitocat です。

弊社では、昨年頭から代表高岡のもと、メンバーが集まり再スタートしました。

僕は昨年の7月から入社して、主にサーバーサイドとインフラを担当してます。

今回は、英単語アプリmikanの本番環境で使っていたFirebaseのプロジェクトの移行に際して、RemoteConfigを移行した話を紹介します。



RemoteConfigの取得

RemoteConfigは設定値がJSONで定義されています。

取得には、RestAPIが用意されているため、それを叩くことで簡単にRemoteConfigのJSONを取得することができます。

firebase.google.com

このとき、認証にはOAuth2.0のアクセストークンが必要になります。僕はプログラムからトークンの発行をしました。

そして、トークンと一緒に以下のようにリクエスト送るとJSONのレスポンスが返ってきます

curl -H 'Authorization: アクセストークン' -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/{{もともと利用していたFirebaseプロジェクトID}}/remoteConfig

RemoteConfigの移行

ダウンロードしてきたJSONには、多くの歴史が詰まっており、とても大きくなってしまっていました。 そして、歴史に詳しいのは弊社の代表だけなので、彼に不要なものを消してもらいました。笑

そのJSONを使って新しく作成したプロジェクトに対して書き込みリクエストを送ります。

このときにもアクセストークンは必要です。また、新しく作成したFirebaseプロジェクトのアクセストークンが必要になるので、再度取得する必要があります。

以下のようなリクエストになりました。

curl -X PUT 'https://firebaseremoteconfig.googleapis.com/v1/projects/{{新しく作成したFirebaseプロジェクトID}}/remoteConfig' \
--header 'Authorization: アクセストークン' \
--header 'Content-Type: application/json' \
--header 'If-Match: エンティティタグ' \

更新には、エンティティタグ(以下、ETag)というものが必要になります。詳しくはこちらを参照すると良いですが、競合状態やリソースの更新の重複を防ぐためにあるようです。

このETagの取得には、RemoteConfigの取得のためのAPIを叩くことで、レスポンスに含まれています。今回は新しくFirebaseプロジェクトを作成したので、一度更新する前にGETAPIを使って、何も設定されていないRemoteConfigのJSONを取得し、そこからETagを取得してから更新のAPIを実行しました。

アプリ側の変更

FirebaseのSDKでは、iOSAndroidともに複数のFirebaseプロジェクトを使うわけることができるので、その変更が必要です。

firebase.google.com

弊社では以下のように環境ごとに使い分けていて、今回は本番環境のみの移行になるので、以下のようにSDKの初期化をします。(iOSでの例)

let productionOptions = FirebaseOptions(contentsOfFile: Bundle.main.path(forResource: "GoogleService-Info-Production", ofType: "plist")!)
if let opts = productionOptions {
    FirebaseApp.configure(name: "production", options: opts)
}

そして、実際にRemoteConfigの値を参照してくるところでは以下のようにして取得することができます。

remoteConfig = RemoteConfig.remoteConfig()
        
// NOTE: Firebase Project本番環境の移行期間中
let production = FirebaseApp.app(name: "production")
if let prd = production {
    remoteConfig = RemoteConfig.remoteConfig(app: prd)
}

FirebaseApp.configure では名前をつけることができるので、移行前と移行後のプロジェクトを使い分けることができます。

まとめ

今回はFirebaseのプロジェクト移行に伴い、RemoteConfigの移行手順を書きました。

  1. 移行前のFirebaseプロジェクトから既存の設定を取得
  2. 移行後のFirebaseプロジェクトからETagを取得する
  3. 移行後のFirebaseプロジェクトに対し、既存の変更を適用する
  4. アプリでRemoteConfig参照部分を移行後のFirebaseプロジェクトに書き換える

まとめると上記の手順で移行が完了します。

Firebaseのドキュメントはとても豊富なのでとても助かりますね。

Firebaseをなぜ移行したのか?についてや、それに伴ってFabricからFirebaseCrashlyticsへの変更手順もあとで書こうと思います。

最後に

弊社では一緒に働く仲間を大募集中です! 教育事業へ興味のある方、また技術的にもチャレンジやれることだらけなので、ぜひ少しでも興味ある方はご連絡ください!

careers.mikan.link