🔥

Firebase Remote Config をプログラム経由で更新する

2020/10/22に公開

Firebase Remote Config をプログラム経由で更新したい理由

簡単にアプリをアップデートせずに設定値などを後から変更できて便利なRemote Configですが、Firebase Webコンソールで手動で設定することが多いと思います。

しかし、この場合、同一アプリを環境ごとにFirebaseプロジェクト分けている時に同じ設定をそれら複数のプロジェクトに適用させるのが面倒かつミスするリスクもあります。

そのため、プログラム経由で適用させられるようにしておくと便利です。
以前はREST APIしか無くて少し面倒でしたが、最近Admin SDKでも操作できるようになったりでより簡単に組めるようになったのでそのやり方を紹介します。
The Firebase Blog: Manage your Remote Config templates from the Admin Node.js SDK

初めは手動で設定してPublish

とりあえず、Firebase Webコンソール上の操作で貼った画像のようにしてPublishします。

Publish済みのRemote ConfigのJSONを取得

Firebase CLIを使うと簡単に現在PublishされているRemote ConfigのJSONを取得できます。

firebase remoteconfig:get --output remoteConfig.json

remoteConfig.json:

{
  "parameterGroups": {
    "mono": {
      "parameters": {
        "foo": {
          "defaultValue": {
            "value": "bar"
          }
        }
      }
    }
  }
}

設定値を変更してみる

そのまま他のFirebaseプロジェクトに適用したいだけなら変更操作は不要ですが、きちんと反映されるかの確認も兼ねて、今回は値をbarからbar2に変更してみます。

{
  "parameterGroups": {
    "mono": {
      "parameters": {
        "foo": {
          "defaultValue": {
            "value": "bar2"
          }
        }
      }
    }
  }
}

デプロイ

functions/src/script/remoteConfig.tsあたりに以下のスクリプトを置きます。

import * as admin from 'firebase-admin'
import * as fs from 'fs'
import * as util from 'util'

export async function publish() {
  admin.initializeApp()

  const config = admin.remoteConfig()
  var currentTemplate = await config.getTemplate()

  const templateJson = {
    ...JSON.parse(fs.readFileSync('remoteConfig.json', 'utf8')),
    // 更新操作に必要
    etag: currentTemplate.etag,
  }
  config.publishTemplate(
    config.createTemplateFromJSON(JSON.stringify(templateJson))
  )
  console.log(util.inspect(templateJson, { depth: null }))
}

ざっくり次のような流れです。

  1. デプロイ済みのテンプレートを取得してetagを得る
  2. 上で用意したremoteConfig.jsonに、更新操作に必要なetagを設定
  3. デプロイ

実行の仕方は色々あると思いますが、tscでビルドして、node -e 'require("./lib/script/remoteConfig").publish()'などがお手軽です。

初めはFirebase CLIだけでデプロイまでできるのかなと期待してましたが、Admin SDKでの操作が必要でした。上記の通り、etagの設定が必要でそれはCLI操作だと厳しいからかなと想像しています。

確認すると、bar2に変わりました🎉

ポチポチ手作業せずに済むようになって良かったですね🐶

GitHubで編集を提案

Discussion