🦊

Firebase Remote Config の一部の値を Node.js と Firebase CLI を使って更新する

2023/04/17に公開

プログラムで実行することになった経緯

Firebase コンソール上で手作業で更新する運用していたところ、開発環境で更新すべきところを誤って本番環境の値を更新するというオペレーションミスが発生した。
2度と繰り返さないよう、更新プログラムを実行する前にレビューを通すことでリスクを軽減する。

こちらの記事では、jsonファイルをアップロードし全ての設定値を更新する方法が紹介されている。
本記事では、特定の値のみ更新するプログラムを運用する方法を紹介する。

Firebase コンソールで手動で値を追加

Firebase コンソール上でRemote Configのパラメータを追加する。
Remote Config

プラットフォーム別に条件を設定する。

Firebase CLIのセットアップ

インストール

% npm install -g firebase-tools

Firebase CLIにログイン

Firebase CLIで使用するGoogleアカウントにログインする。
次にプロジェクト一覧を出力しFirebaseコンソールと同期できていることを確認する。

% firebase login
% firebase projects:list

カレントプロジェクトを指定

プロジェクトを切り替える。

% firebase use numa-sample-project-dev

Remote ConfigをJson形式で取得

Firebase CLIを使ってRemote Configの最新の状態をフェッチし、確認する。

% firebase remoteconfig:get --output remote_config_values.json

以下フェッチしたjson。コンソールで追加したkey-valueが含まれている。

{
  "conditions": [
    {
      "name": "ios",
      "expression": "device.os == 'ios'",
      "tagColor": "BLUE"
    },
    {
      "name": "android",
      "expression": "device.os == 'android'",
      "tagColor": "GREEN"
    }
  ],
  "parameters": {
    "hoge_flag": {
      "defaultValue": {
        "value": "false"
      },
      "conditionalValues": {
        "ios": {
          "value": "false"
        },
        "android": {
          "value": "false"
        }
      },
      "valueType": "BOOLEAN"
    }
  }
}

設定値を変更する

Admin SDKのセットアップ

まず、Firebase Admin SDKをインストールして初期化する必要がある。firebase-adminパッケージをインストールするには、以下のコマンドを実行する。

% npm install firebase-admin

GoやPythonもサポートしているらしい。
https://firebase.google.com/docs/reference/admin?hl=ja

Firebase コンソールからサービスアカウントキーを取得

Firebase Admin SDK を使用できるようになるには
Firebase コンソールからサービスアカウントキーを取得し、
プログラムで指定する必要がある。

値を更新するプログラム

update_remote_config.jsを作成し、Node.jsのコードでhoge_flagを更新するプログラムを書く。

const admin = require('firebase-admin');

// 初期化時にサービスアカウントキーのパスを指定
const serviceAccount = require('./firebase-adminsdk.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

const remoteConfig = admin.remoteConfig();

// Remote Config の Boolean 型の値を条件ごとに更新する関数
async function updateRemoteConfig(key, iosValue, androidValue) {
  // 現在のRemote Configの値を取得
  const template = await remoteConfig.getTemplate();

  // 値を更新
  if (!template.parameters[key]) {
    template.parameters[key] = {};
  }

  // iOS と Android の条件を作成
  const iosCondition = {
    name: "ios",
    expression: "device.os == 'ios'",
    tagColor: "BLUE",
  };
  const androidCondition = {
    name: "android",
    expression: "device.os == 'android'",
    tagColor: "GREEN",
  };

  // 条件をテンプレートに追加
  template.conditions = [iosCondition, androidCondition];

  // 条件ごとの値を設定
  template.parameters[key].conditionalValues = {
    ios: { value: JSON.stringify(iosValue) },
    android: { value: JSON.stringify(androidValue) },
  };

  // Remote Configを更新(更新されたテンプレートを適用)
  await remoteConfig.publishTemplate(template);
  console.log('Remote Config updated successfully');
}

updateRemoteConfig("hoge_flag", true, true).catch((error) => {
  console.error('Error updating Remote Config:', error);
});

プログラム実行

% node update_remote_config.js

無事更新できた 🎉

このプログラムをgitでリポジトリにプッシュしてリスクを減らす運用をしていきたい。

補足

Firebase CLIで更新までできるつもりでいたが2023/4現在はFirebase CLIだけでは更新できないようだった。
https://firebase.google.com/docs/cli?hl=ja#config-commands

Voicyテックブログ

Discussion